Javaweb-文件上传下载

  1. 文件上传准备:
         1):上传控件所在的<form>表单的method,必须为POST:
         2):至少一个上传控件,得使用type为file的类型.<input type="file" name="headImg" />
         3):表单的编码方式必须是二进制编码.<form enctype="multipart/form-data">
    <form enctype="multipart/form-data">,在Servlet中 不能通过request.getParamenter 获取参数 (则设置编码都没有效果)
     4)最后都要获取(是有一定格式的二进制流)、解析(将简单String...类型数据解析为Javabean),保存  。手动getInputStream()获取,再解码(不推荐)或用第三方的 (底层依然是在解析HTTP的请求实体)           在项目中导入相关的jar包:commons-fileupload-1.2.2.jar    commons-io-1.4.jar

  2. 上传文件名称处理:
     1: IE6问题:通过FileItem.getName方法获取上传文件的名称,此时会带有路径:
        其他浏览器:  seemygo.png,
         IE6:       C:\123\seemygo.png.
    使用FilenameUtils.getName(path);
    2: 上传文件名称:给上传的文件起唯一的名称: UUID.
    String randomFileName = UUID.randomUUID().toString()+"."+FilenameUtils.getExtension(fileName);
    3: 上传文件的保存路径: 一般的,把上传文件保存到应用里面.
    不同服务器项目所在路径未知,未必有此磁盘,应使用相对路径用方法获取绝对路径
    req.getServletContext().getRealPath("/upload");
    item.write(new File(fileName));
    item.write(new File(realPath,uuid+"."+extension));

  3.  

     二:缓存大小和临时目录:
           缓存大小:超过该缓存大小的值,就保存到临时文件.   默认是10240字节,10KB.
           临时目录:Tomcat根/temp目录. (一般不设置.)   
           factory.setSizeThreshold(1024 * 10 * 5);//50KB //设置缓存大小
           factory.setRepository(new File("C:/temp")); //设置临时目录
       三:限定文件上传的类型和异常处理: 通过拓展名或contentType
       四:文件大小约束:
          情况1:  单个文件超过指定的大小.            upload.setFileSizeMax(1024 * 3);//3K
           情况2:  该次请求的全部数据超过指定的大小.  upload.setSizeMax(1024 * 5);//5K

    一:公享资源放在WEB-INF外用<a href=”资源的相对路径"/> 点击打开文件,用浏览器下载
    二:针对web-INF下的资源下载
    设置响应报头 contentType: application/x-msdownload
    告诉浏览器其所输出的内容的类型不是普通的文本文件或 HTML 文件,
    而是一个要保存到本地的下载文件
    response.setContentType("application/x-msdownload");
    --------------------------------------------------------
    设置响应抱头 Content-Disposition: attachment
    Web 服务器希望浏览器不直接处理相应的实体内容,
    而是由用户选择将相应的实体内容保存到一个文件中
    response.setHeader("Content-Disposition", "attachment; filename=建议保存名称")
    --------------------------------------------------------
    解决下载保存文件乱码问题
    (FF)response.setHeader("Content-Disposition","attachment;filename="+new String(filename.getBytes("UTF-8"),"ISO8859-1"));
    (IE)response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(filename, "utf-8"));

    Files.copy(Paths.get(下载文件的绝对路径,OutPutStream))        Files.copy(Paths.get(file.getAbsolutePath()), resp.getOutputStream());

    package com.upload;
    
    import java.io.File;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.util.List;
    import java.util.UUID;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    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.FileItemFactory;
    import org.apache.commons.fileupload.FileUploadException;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    import org.apache.commons.io.FilenameUtils;
    
    @WebServlet("/upload")
    public class DownloadServlet extends HttpServlet {
    
    	@Override
    	protected void service(HttpServletRequest req, HttpServletResponse resp) throws UnsupportedEncodingException {
    		// boolean isMultipart = FileUploadUtil.isMultipartContent(req);
    		boolean isMultipart = ServletFileUpload.isMultipartContent(req);
    		if (isMultipart) {
    			FileItemFactory factory = new DiskFileItemFactory();
    
    			ServletFileUpload upload = new ServletFileUpload(factory);
    			// upload.setFileSizeMax(1024 * 10);
    			// upload.setSizeMax(1024 * 120);
    
    			try {
    				// name StoreLocation size isFormField FieldName
    				// name StoreLocation size isFormField FieldName
    				List<FileItem> items = upload.parseRequest(req);
    				for (FileItem item : items) {
    					if (item.isFormField()) {
    						String fieldName = item.getFieldName();
    						System.out.println(fieldName);
    						System.out.println(item.getString("utf-8"));
    					} else {
    						String realPath = req.getServletContext().getRealPath("\\upload");
    						System.out.println(realPath);
    						String name = FilenameUtils.getName(item.getName());
    						System.out.println(name);
    						String extension = FilenameUtils.getExtension(name);
    						System.out.println(extension);
    						String uuid = UUID.randomUUID().toString().substring(0, 5);
    						String fileName = realPath + File.separator + uuid + "." + extension;
    						System.out.println(fileName);
    						String contentType = item.getContentType();
    						System.out.println(contentType);
    						long size = item.getSize();
    						System.out.println(size);
    						try {
    							if (size != 0) {
    								item.write(new File(fileName));
    								// item.write(new
    								// File(realPath,uuid+"."+extension));
    							}
    						} catch (Exception e) {
    
    							e.printStackTrace();
    						}
    					}
    
    				}
    
    			} catch (FileUploadException e) {
    
    				e.printStackTrace();
    			}
    		}
    	}
    
    }
    
    package com.upload;
    
    import java.io.File;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.net.URLEncoder;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.util.List;
    import java.util.UUID;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    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.FileItemFactory;
    import org.apache.commons.fileupload.FileUploadException;
    import org.apache.commons.fileupload.disk.DiskFileItemFactory;
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    import org.apache.commons.io.FilenameUtils;
    import org.apache.commons.lang3.StringUtils;
    
    @WebServlet("/download")
    public class UploadServlet extends HttpServlet {
    
    	@Override
    	protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    		req.setCharacterEncoding("UTF-8");
    		resp.setContentType("application/x-msdownload");
    		String fileName = req.getParameter("fileName");
    		String realPath = req.getServletContext().getRealPath("/WEB-INF/download");
    		File file = new File(realPath, fileName);
    		System.out.println(file);
    		String header = resp.getHeader("User-Agent");
    		System.out.println(header);
    		if (StringUtils.isNoneBlank(header)) {
    			if (header.contains("MSIE") || header.contains("Gecko")) {
    				fileName = URLEncoder.encode(fileName, "utf-8");
    			} else {
    				fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
    			}
    		}
    		resp.setHeader("Content-Disposition", "attachment;filename=" + fileName);
    		Files.copy(Paths.get(file.getAbsolutePath()), resp.getOutputStream());
    	}
    
    }
    

     

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值