通过httpclient把文件上传到服务器-------服务器处理部分

一:上传-----------------------

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地址 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值