文件的上传与下载(二)

1.如何使用开源组件以及查看文档

  1. 开源组件:

           commons-fileupload-1.4-bin.zip

          commons-io-2.6-bin.zip

     2. 以fileupload组件为例学习如何使用开源包

            解压 commons-fileupload-1.4-bin.zip得到两个文件夹apidoc和site

            其中site为用户指导,apidoc为相关类以及类方法的说明文档

apidoc
用户指导

 2.基本思想

        >commons-fileupload 可以解析请求,得到一个由FileItem对象组成的List

        >commons-fileupload把所有的请求信息都解析为FileItem对象,无论是一个一般的文本域还是文件域

       >可以调用FileItem的isFormField()方法来判断是一个表单域或不是一个表单域(文本域) 

      >其他

// Process a regular form field
if (item.isFormField()) {
    String name = item.getFieldName();
    String value = item.getString();
    ...
}
// Process a file upload
if (!item.isFormField()) {
    String fieldName = item.getFieldName();
    String fileName = item.getName();
    String contentType = item.getContentType();
    boolean isInMemory = item.isInMemory();
    long sizeInBytes = item.getSize();
    InputStream uploadedStream = item.getInputStream();
    ...
    uploadedStream.close();
}

 3. 基本使用方法

简单的方式

// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();

// Configure a repository (to ensure a secure temp location is used)
ServletContext servletContext = this.getServletConfig().getServletContext();
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
factory.setRepository(repository);

// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);

// Parse the request
List<FileItem> items = upload.parseRequest(request);

复杂的方式:可以为文件的上传添加一些控制或者其他的功能

// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();

// Set factory constraints
//设置读入内存的文件的大小,若内存的文件超出改大小,就把这部分文件写入磁盘(临时文件夹),单位byte
factory.setSizeThreshold(yourMaxMemorySize);
//设置临时文件夹
factory.setRepository(yourTempDirectory);

// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);

// 设置一次reques所能上传的总文件的大小
upload.setSizeMax(yourMaxRequestSize);

// Parse the request
List<FileItem> items = upload.parseRequest(request);

4. 简单使用的HelloWord

/**
 * Servlet implementation class UploadServlet
 */
@WebServlet("/uploadServlet")
public class UploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1.得到FileItem的集合items
		DiskFileItemFactory factory = new DiskFileItemFactory();
		//设置读入内存的文件的大小500k,若内存的文件超出改大小,就把这部分文件写入磁盘(临时文件夹),单位byte
		factory.setSizeThreshold(1025*500);
		//设置临时文件夹
		File tempDirectory = new File("E:\\tmp");
		factory.setRepository(tempDirectory);

		ServletFileUpload upload = new ServletFileUpload(factory);

		// 设置一次reques所能上传的总文件的大小<5M
		upload.setSizeMax(1024*1024*5);

		// Parse the request
		try {
			List<FileItem> items = upload.parseRequest(request);
			//2.遍历items,若item为一般的表单域,则打印信息,若不为表单域(文件域),就写入磁盘
			for(FileItem item : items) {
				if(item.isFormField()) {//如果是表单域
					String name = item.getFieldName();
					String value = item.getString();
					System.out.println(name+" : "+value);
				}else {//如果不是表单域(文件域)
				    String fileName = item.getName();
				    String fileNameArray[] = fileName.replaceAll("\\\\","/").split("/"); 
				    //进行文件传输
				    String path = "E:\\tmp\\" +fileNameArray[fileNameArray.length-1] ;
				    InputStream in = item.getInputStream();
				    byte[] buffer = new byte[1024];
				    int len = 0;
				    
				    FileOutputStream out = new FileOutputStream(path);	
				    while( (len = in.read(buffer)) != -1) {
				    	out.write(buffer,0,len);
				    }
				    out.close();
				    in.close();	    
				}
			}
		} catch (FileUploadException e) {
			e.printStackTrace();
		}
		
		
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值