-
文件上传准备:
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 -
上传文件名称处理:
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)); -
二:缓存大小和临时目录:
缓存大小:超过该缓存大小的值,就保存到临时文件. 默认是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()); } }
Javaweb-文件上传下载
最新推荐文章于 2024-03-08 18:34:43 发布