一:上传-----------------------
1、首先客户端前端是通过HttpClient中的PostMethod类,传进去一个连接地址,访问服务器上传页面
该页面如下:
<ui:composition xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">
<f:event type="preRenderView"
listener="#{UploadImageBean.upload}" />
</ui:composition>
2、然后服务器代码后台会先接受连接中的参数,通过一些处理,保存文件,并返回给发送段一个地址url,可以直接在浏览器中输入url访问上传到服务器的文件
代码处理如下:
package com.xpa.media;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Map;
import java.util.TreeMap;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import cn.common.util.CryptoKit;
import cn.common.util.MediaConfiguration;
import cn.common.util.MediaKit;
import cn.common.util.RequestUtil;
@Controller("UploadImageBean")
@Scope("request")
public class UploadImageController {
@Autowired(required = true)
private MediaConfiguration config;
public void upload() throws IOException, ServletException {
System.out.println("enter upload");
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
HttpServletRequest request = (HttpServletRequest) externalContext
.getRequest();
HttpServletResponse response = (HttpServletResponse) externalContext
.getResponse();
String mediaKey = RequestUtil.getRequestParam(MediaKit.MEDIA_KEY);
String mediaApp = RequestUtil
.getRequestParam(MediaKit.MEDIA_APP);
String mediaName = RequestUtil
.getRequestParam(MediaKit.MEDIA_FILENAME);
String fileName = generateFileName(mediaName);
System.out.println( "mediaApp=" + mediaApp );
System.out.println( "mediaKey=" + mediaKey );
System.out.println( "mediaName=" + mediaName );
mediaKey = CryptoKit.decode(MediaKit.URLDecode(mediaKey));
// System.out.println(appId + "\t" + mediaId + "\t" + mediaKey);
System.out.println("parameterMap size:"
+ request.getParameterMap().size());
Map<String, String[]> map = request.getParameterMap();
for (String key : map.keySet()) {
System.out.println(key + ":\t" + request.getParameter(key));
String[] vals = map.get(key);
if (null != vals) {
System.out.print("key:");
for (String v : vals)
System.out.print(v);
}
System.out.println();
}
System.out.println("Part size:" + request.getParts().size());
//检查httpClient调用参数,必须输入mediaName,mediaKey
Map<String , String> result = new TreeMap<String, String>();
if (!MediaKit.parseMediaKey(mediaKey, result))
{
System.out.println("params is error");
response.getWriter().write("");
return;
}
//解密检测后,mediaKey中的fileName必须和mediaName一致
if (! mediaApp.equals(result.get(MediaKit.MEDIA_APP))) {
System.out.println("params is null");
response.getWriter().write("");
return;
}
String path = config.getMediaPath() + File.separator
+ result.get(MediaKit.MEDIA_PATH) ;//
//String mediaName = MediaKit.getMediaPathName(mediaKey);
File dir = new File(path);
if (!dir.exists()) {
dir.mkdirs();
}
if (!ServletFileUpload.isMultipartContent(request)) {
System.out.println("isMultipartContent is false");
return;
}
System.out.println("isMultipartContent is true");
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设定内存可以存放文件的最大容量,单位字节,超过的部分会以临时文件的形式存放在硬盘上,这里设置成10兆
//factory.setSizeThreshold(MediaConstant.MEDIA_STORE_BUFFER);
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置单个文件最大容量限制,-1表示没有限制
upload.setFileSizeMax(-1);
// 设置整个请求的上传容量限制,-1表示没有限制
upload.setSizeMax(-1);
Collection<Part> parts = request.getParts();
// request.getPart("").
for (Part part : parts) {
if (map.containsKey(part.getName())) {
continue;
}
// System.out.println(part.getContentType());
// System.out.println(part.getHeader("content-disposition"));
if (part.getContentType().contains("text/plain")) {
System.out.println(part.getName());
System.out.println("getContentType is text/plain:"
+ part.getHeader("content-disposition"));
} else {
System.out.println("Prepare to write file:" + path + File.separator + fileName);
FileUtils.copyInputStreamToFile(part.getInputStream(),
new File(path + File.separator + fileName));
part.delete();
}
}
mediaKey= MediaKit.generateMediaKey(mediaApp, new Date(), fileName);
String durl = config.getDownloadUrl() + MediaKit.MEDIA_APP + "=" + MediaKit.URLEncode(mediaApp) + "&" + MediaKit.MEDIA_KEY + "=" + MediaKit.URLEncode(mediaKey) + "&" + MediaKit.MEDIA_FILENAME + "=" + MediaKit.URLEncode(mediaName);
response.getWriter().write(durl);
}
private String generateFileName(String mediaName)
{
SimpleDateFormat sdf = new SimpleDateFormat(MediaKit.MEDIA_FILE_FMT);
String name = sdf.format(new Date());
return name + "." + FilenameUtils.getExtension(mediaName);
}
}
二:查看------------------------
1、首先在浏览器地址栏输入上传之后返回的url,会向服务器发送一个请求访问服务器查看页面
页面如下:
<ui:composition xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">
<f:event type="preRenderView"
listener="#{GetImageBean.getImage}" />
</ui:composition>
2、然后服务器代码后台会先接受连接中的参数,通过参数来查看服务器上传的该文件
代码处理如下:
package com.xpa.media;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.TreeMap;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import cn.common.util.CryptoKit;
import cn.common.util.MediaConfiguration;
import cn.common.util.MediaKit;
import cn.common.util.RequestUtil;
@Controller("GetImageBean")
@Scope("request")
public class GetImageController {
private static final Logger log = Logger
.getLogger(RemoveImageController.class);
@Autowired(required = true)
private MediaConfiguration config;
public void getImage() {
String mediaApp = RequestUtil.getRequestParam(MediaKit.MEDIA_APP);
String mediaKey = RequestUtil.getRequestParam(MediaKit.MEDIA_KEY);
String mediaName = RequestUtil
.getRequestParam(MediaKit.MEDIA_FILENAME);
// 参数非法
if (null == mediaApp || mediaApp.isEmpty() || null == mediaKey || mediaKey.isEmpty()) {
log.debug("param is null!");
return;
}
log.debug( "mediaName=" + mediaName );
log.debug( "mediaApp=" + mediaApp );
log.debug( "mediaKey=" + mediaKey );
mediaKey = CryptoKit.decode(MediaKit.URLDecode(mediaKey));
// 有效性校验失败
Map<String , String> result = new TreeMap<String, String>();
if (!MediaKit.parseMediaKey(mediaKey, result))
{
log.debug("params is error");
//response.getWriter().write("");
return;
}
String path = config.getMediaPath() + File.separator + result.get(MediaKit.MEDIA_PATH);
File fp = new File(path);
if (!(fp.exists() && fp.isDirectory()))
{
log.debug("directory is not exists!");
return;
}
String fname = result.get(MediaKit.MEDIA_FILENAME);
File file = new File(path + File.separator + result.get(MediaKit.MEDIA_FILENAME));
if (!(fp.exists() && fp.canRead()))
{
log.debug("file is not exists or not readable!");
return;
}
int len = (int) FileUtils.sizeOf(file);
String surffix = FilenameUtils.getExtension(fname);
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
externalContext.setResponseContentType(MediaKit.getMimeType(surffix));
externalContext.setResponseContentLength(len);
externalContext.setResponseCharacterEncoding("UTF-8");
externalContext.setResponseHeader("Content-Disposition",
"attachment; filename=\"" + fname + "\"");
//InputStream inStream;
try {
log.debug("begin response to client!");
InputStream inStream = new FileInputStream(file);
//byte[] buffer = new byte[MediaConstant.MEDIA_BUFFER];
//int size = 0;
//while (0 != (size = inStream.read(buffer))) {
IOUtils.copy(inStream, externalContext.getResponseOutputStream());
inStream.close();
//}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
log.debug("finish response to client!");
facesContext.responseComplete();
}
}
}
三:删除-------------------------
1、首先客户端前端是通过HttpClient中的GetMethod类,传进去一个连接地址,访问服务器删除页面
页面如下:
<ui:composition xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">
<f:event type="preRenderView"
listener="#{RemoveImageBean.removeImage}" />
</ui:composition>
2、然后服务器代码后台会先接受连接中的参数,通过参数来删除该服务器中存储的文件,并返回一个状态值(200表示删除成功)
代码处理如下:
package com.xpa.media;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.TreeMap;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import cn.common.util.CryptoKit;
import cn.common.util.MediaConfiguration;
import cn.common.util.MediaKit;
import cn.common.util.RequestUtil;
@Controller("RemoveImageBean")
@Scope("request")
public class RemoveImageController {
private static final Logger log = Logger
.getLogger(RemoveImageController.class);
@Autowired(required = true)
private MediaConfiguration config;
public void removeImage() {
String mediaApp = RequestUtil.getRequestParam(MediaKit.MEDIA_APP);
String mediaKey = RequestUtil.getRequestParam(MediaKit.MEDIA_KEY);
String mediaName = RequestUtil.getRequestParam(MediaKit.MEDIA_FILENAME);
// 参数非法
if (null == mediaApp || mediaApp.isEmpty() || null == mediaKey
|| mediaKey.isEmpty()) {
log.debug("param is null!");
return;
}
log.debug("mediaName=" + mediaName);
log.debug("mediaApp=" + mediaApp);
log.debug("mediaKey=" + mediaKey);
mediaKey = CryptoKit.decode(MediaKit.URLDecode(mediaKey));
// 有效性校验失败
Map<String, String> result = new TreeMap<String, String>();
if (!MediaKit.parseMediaKey(mediaKey, result)) {
log.debug("params is error");
// response.getWriter().write("");
return;
}
String path = config.getMediaPath() + File.separator
+ result.get(MediaKit.MEDIA_PATH);
File fp = new File(path);
if (!(fp.exists() && fp.isDirectory())) {
log.debug("directory is not exists!");
return;
}
String fname = result.get(MediaKit.MEDIA_FILENAME);
File file = new File(path + File.separator
+ fname);
if (!(fp.exists() && fp.canWrite())) {
log.debug("file is not exists or not deleted!");
return;
}
boolean bDel = file.delete();
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
//externalContext.setResponseContentType(MediaKit.getMimeType(surffix));
//externalContext.setResponseContentLength(len);
externalContext.setResponseCharacterEncoding("UTF-8");
try {
if (bDel) {
externalContext.getResponseOutputWriter().write("OK");
} else {
externalContext.getResponseOutputWriter().write("FAILED");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
log.debug("finish response to client!");
facesContext.responseComplete();
}
}
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
这里用到了一个配置文件:通过spring把 MediaConfiguration类纳入到sping容器中,通过配置文件给MediaConfiguration类赋值一些属性:
<context:property-placeholder location="classpath:media.properties"
ignore-unresolvable="true" />
<bean id="MediaConfig" class="cn.richbridge.common.util.MediaConfiguration">
<property name="mediaPath" value="${media.store}" />
<property name="tmpPath" value="${media.temp}" />
<property name="uploadUrl" value="${media.upload}" />
<property name="downloadUrl" value="${media.download}" />
<property name="removeUrl" value="${media.remove}" />
</bean>
然后 media.properties文件中内容:
media.upload=http://localhost:8080/images/upload.do?
media.download=http://localhost:8080/images/download.do?
media.remove=http://localhost:8080/images/remove.do?
#localhost到时候可以换成自己服务器的IP地址