文件上传和下载
1. 上传
前端的准备
-
需要一个form 标签,method = post ,input 类型为file -
encType 属性必须是multipart/form-data encType=multipart/form-data 表示提交的数据,以多段(每一个表单项一个数据段)的形式拼接,然后以二进制流的形式发送给服务器
后端:
1.HttpServletRequest提供的方法
- Part
getPart(String name) :根据名称获取文件上传域 - Collection
getParts() :获取所有的文件上传域
2.Part中常用的方法
- String
getContentType() :获取上传文件的文件类型 - long
getSize() :上传文件的大小 - String
getSubmittedFileName() :上传文件的原始文件名 - String
getName() :获取<input name=“upload” …>标签中name属性值 - String
getHeader(String name) :获取请求头部 - Collection
getHeaderNames() :获取所有请求头部名称 - InputStream
getInputStream() :获取上传文件的输入流 - void
write(String path) :保存文件至服务器
@MultipartConfig注解属性说明
属性 | 类型 | 是否必需 | 说明 |
---|
maxFileSize | long | 否 | | maxRequestSize | long | 否 | | fileSizeThreshold | int | 否 | | location | String | 否 | |
FileUtils:几个操作
package utils;
import java.io.File;
import java.util.UUID;
public class FileUtils {
public static String fileSave(String fileName, String fileSaveRoot) {
int hash = fileName.hashCode();
int dir1 = hash & 0xf;
int dir2 = (hash & 0xf0) >> 4;
String fileSavePath = fileSaveRoot + File.separator + dir1 + File.separator + dir2;
File file = new File(fileSavePath);
if(!file.exists()){
file.mkdirs();
}
return fileSavePath;
}
public static String makeFileName(String fileName) {
return UUID.randomUUID().toString() + "_" + fileName;
}
public static String extractFileName(String fileUUIDName) {
int index = fileUUIDName.indexOf("_");
return fileUUIDName.substring(index + 1);
}
}
Servlet
String savePathRoot = getServletContext().getRealPath(
"/WEB-INF/classes/picture");
ArrayList<String> list = new ArrayList<String>();
Collection<Part> parts = request.getParts();
for (Part part : parts) {
String fileName = part.getSubmittedFileName();
if (fileName == null) {
continue;
}
String fileUUIDName = FileUtils.makeFileName(fileName);
String saveDir = FileUtils.fileSave(fileUUIDName, savePathRoot);
list.add(fileUUIDName);
String realPath = saveDir + File.separator + fileUUIDName;
part.write(realPath);
part.delete();
}
2. 下载
读文件流进Servlet输出流里面进行输出即可
然后再写上头
意的是这边要对文件名进行URL UTF-8编码,不然在浏览器控制台会显示????
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String fileUUIDName = request.getParameter("fileName");
String fileName = FileUtils.extractFileName(fileUUIDName);
System.out.println(fileName);
String fileRoot = this.getServletContext().getRealPath("/WEB-INF");
String fileDir = FileUtils.fileSave(fileUUIDName, fileRoot);
String targetFileUrl = fileDir + File.separator + fileUUIDName;
System.out.println(targetFileUrl);
File file = new File(targetFileUrl);
if (!file.exists()) {
System.out.println("目标文件不存在");
return;
}
response.setHeader("content-disposition",
"attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
FileInputStream inputStream = new FileInputStream(file);
ServletOutputStream servletOutputStream = response.getOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) > 0) {
servletOutputStream.write(buffer, 0, len);
}
inputStream.close();
servletOutputStream.close();
}
|