`
rainsilence
  • 浏览: 160566 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

(原)仿HttpClient实现HTTP上传

阅读更多
话不多说了,大家看代码吧

模拟上传提交,发送端
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * HTTP上传文件实现类
 */
public class HttpUpload {

	/** 缓冲大小 */
	private static final int BYTE_BUFFER_SIZE = 1024;

	/** 分隔符 */
	private static final String BOUNDARY = "---------------------------7d4a6d158c9";

	/** Form名 */
	private String formName;

	/**
	 * @return the formName
	 */
	public String getFormName() {
		return formName;
	}

	/**
	 * @param formName
	 *            the formName to set
	 */
	public void setFormName(String formName) {
		this.formName = formName;
	}

	/**
	 * 得到上传的HTTP头
	 * 
	 * @param fileName 文件名
	 */
	private byte[] getHttpUploadHeader(String fileName) {

		if (formName == null || formName.length() == 0) {
			formName = "fileDefaultForm";
		}

		StringBuilder builder = new StringBuilder();
		builder.append("--").append(BOUNDARY).append("\r\n").append(
				"Content-Disposition: form-data; name=\"").append(formName)
				.append("\"; filename=\"").append(fileName).append("\"\r\n")
				.append("Content-Type: application/octet-stream\r\n\r\n");
		return builder.toString().getBytes();
	}

	/**
	 * 上传主调方法
	 */
	public void upload(String urlPath, String filePath) throws IOException {

		URL url = null;
		File file = null;
		FileInputStream inputStream = null;

		HttpURLConnection connection = null;

		try {
			url = new URL(urlPath);
			file = new File(filePath);
			inputStream = new FileInputStream(file);

			connection = (HttpURLConnection) url.openConnection();

			connection.setDoInput(true);
			connection.setDoOutput(true);
			connection.setUseCaches(false);
			connection.setRequestMethod("POST");

			int total = inputStream.available();

			byte[] dataStart = getHttpUploadHeader(file.getName());
			byte[] dataEnd = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();

			// 设置表单类型和分隔符
			connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);

			// 设置内容长度
			connection.setRequestProperty("Content-Length", String.valueOf(dataStart.length + total + dataEnd.length));

			OutputStream postStream = connection.getOutputStream();

			postStream.write(dataStart);

			int current = 0;
			while (current < total) {

				byte[] b = new byte[BYTE_BUFFER_SIZE];

				if (total < BYTE_BUFFER_SIZE + current) {
					inputStream.read(b, 0, total - current - 1);
				} else {
					inputStream.read(b, 0, BYTE_BUFFER_SIZE);
				}

				postStream.write(b);

				current += BYTE_BUFFER_SIZE;
			}

			postStream.write(dataEnd);

			postStream.flush();
			postStream.close();

			// Send Stream
			InputStream is = connection.getInputStream();
			is.close();

		} catch (MalformedURLException e) {
			e.printStackTrace();
			throw e;
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			throw e;
		} catch (IOException e) {
			e.printStackTrace();
			throw e;
		} finally {
			if (inputStream != null) {
				inputStream.close();
			}
			if (connection != null) {
				connection.disconnect();
			}

		}
	}

	public static void main(String args[]) throws Exception {
		new HttpUpload().upload(
				"http://localhost:8085/FileUploadAdvance/BigFileUploadServlet",
				"D:\\face.jpg");
	}
}


测试的时候用apache common中的fileupload组件接收
package org.test;

import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 * Servlet implementation class BigFileUploadServlet
 */
public class BigFileUploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	private static final String WORK_DIR_PATH = "workDir";
	
	private File workDir = null;
	
	private static final String DESTINATION_DIR_PATH = "destDirPath";
	
	private File destDir = null;
	
	private String destDirPath = null;
	
    /**
     * @see HttpServlet#HttpServlet()
     */
    public BigFileUploadServlet() {
        super();
    }

    public void init(ServletConfig config) throws ServletException {
    	
    	String workDirPath = config.getInitParameter(WORK_DIR_PATH);
    	
    	destDirPath = config.getInitParameter(DESTINATION_DIR_PATH);
    	
    	if (workDirPath != null && workDirPath.length() > 0) {
    		workDir = new File(workDirPath);
    		if (!workDir.exists()) {
    			workDir.mkdirs();
    		}
    	}
    	
    	if (destDirPath != null && destDirPath.length() > 0) {
    		destDir = new File(destDirPath);
    		if (!destDir.exists()) {
    			destDir.mkdirs();
    		}
    	}
    }
    
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try {
			process(request, response);
		} catch(Exception  e) {
			System.out.println(e);
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		try {
			process(request, response);
		} catch(Exception  e) {
			System.out.println(e);
		}
	}
	
	private void process(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		DiskFileItemFactory factory = new DiskFileItemFactory();
		factory.setSizeThreshold(500);
		factory.setRepository(workDir);
		// Create a new file upload handler
		ServletFileUpload upload = new ServletFileUpload(factory);
		
		//ActionContext.initCurrentContext(request, response);
		
		//upload.setProgressListener(new ProgressAdapter(ActionContext.getActionContext()));
		//upload.setSizeMax(200);
		
		// Parse the request
		List<FileItem> items = upload.parseRequest(request);
		
		for (FileItem item : items){
		    
		    if (!item.isFormField()) {
		    	String fieldName = item.getFieldName();
		        String fileName = getFileName(item.getName(), "\\");
		        fileName = getFileName(fileName, "/");
		        
		        String contentType = item.getContentType();
		        boolean isInMemory = item.isInMemory();
		        long sizeInBytes = item.getSize();
		        item.write(new File(destDirPath + fileName));
		    }
		}	
	}
	
	private String getFileName(String originName, String searchChar) {
		
		int pathIndex = originName.lastIndexOf(searchChar);
		
		if (pathIndex != -1) {
			return originName.substring(pathIndex + searchChar.length());
		}
		return originName;
	}

}


web.xml中配置如下
<servlet>
    <description></description>
    <display-name>BigFileUploadServlet</display-name>
    <servlet-name>BigFileUploadServlet</servlet-name>
    <servlet-class>org.test.BigFileUploadServlet</servlet-class>
    <init-param>
      <param-name>workDir</param-name>
      <param-value>E:/temp/</param-value>
    </init-param>
    <init-param>
      <param-name>destDirPath</param-name>
      <param-value>E:/fileTemp/</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>BigFileUploadServlet</servlet-name>
    <url-pattern>/BigFileUploadServlet</url-pattern>
  </servlet-mapping>
分享到:
评论
1 楼 laserdance 2012-01-10  
没有断点续传功能.

相关推荐

    java开源包3

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包4

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    JAVA上百实例源码以及开源项目源代码

    日历表格面板 [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接...

    java开源包1

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包11

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包2

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包6

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包5

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包10

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包8

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包7

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包9

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    java开源包101

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    Java资源包01

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

Global site tag (gtag.js) - Google Analytics