开学半个月终于从开学期末粥和班级事务中解脱开了,累死,还是沉浸在代码世界宁静一些。
这一章本身与Tomcat没什么关系了 不过载体框架还是Tomcat还是记在这个专栏里吧。
首先框架是前端用ajax(XMLhttprequest)+FormData发送文件数据
后端用别人写的代码来分析所获得的数据流并解析出文件而后保存在服务器。
更为细致的描述见https://www.cnblogs.com/jimisun/p/9419269.html
我只是记录下我需要用到的内容。前辈真的强!!CTRL+C/V真爽
前端:
formData中有4个键值对
“file”对应的就是需要上传的文件
“fileName”方便后台保存文件
XMLHttpRequest的接口用就可以。
//uploadFile.js
function uploadFileToServer() {
var uploadFile = document.getElementById("upload_file_id");
let formData = new FormData();
formData.append("file",uploadFile.files[0]);
formData.append("fileSize",uploadFile.files[0].size.toString());
formData.append("fileName",uploadFile.files[0].name);
let xhr = new XMLHttpRequest();
xhr.open("POST","/file/upload",true);
xhr.send(formData);
}
在原帖中强调了表单新加一个属性enctype,值为”multipart/form-data”,但是对于我们用FormData的就无所谓了。
后端:
后端按照原帖的处理还蛮麻烦的,但是都是可以复制黏贴的代码,所以无所谓啦:
把数据对象DTO和数据处理工具Util独立
DTO
package cn.CakeCN.util;
import org.apache.commons.fileupload.FileItem;
import java.util.HashMap;
import java.util.Map;
public class OperateUploadFileDTO {
private Map<String,String> paramMap;
private Map<String,FileItem> fileMap;
public OperateUploadFileDTO() {
paramMap = new HashMap<>();
fileMap = new HashMap<>();
}
public Map<String, String> getParamMap() {
return paramMap;
}
public void setParamMap(Map<String, String> paramMap) {
this.paramMap = paramMap;
}
public Map<String, FileItem> getFileMap() {
return fileMap;
}
public void setFileMap(Map<String, FileItem> fileMap) {
this.fileMap = fileMap;
}
}
Util:
package cn.CakeCN.util;
import cn.CakeCN.util.OperateUploadFileDTO;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.List;
public class OperateUploadFileUtil {
/**
* 从request流中解析参数与上传的文件
* @param request
*/
public static OperateUploadFileDTO parseParam(HttpServletRequest request) {
OperateUploadFileDTO result = new OperateUploadFileDTO();
//创建一个FileItem工厂 通过DiskFileItemFactory对象创建文件上传核心组件
ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
upload.setHeaderEncoding("UTF-8");
try {
//通过文件上传核心组件解析request请求,获取到所有的FileItem对象
List<FileItem> fileItemList = upload.parseRequest(request);
//遍历表单的所有表单项(FileItem) 并对其进行相关操作
for(FileItem fileItem : fileItemList) {
//判断这个表单项如果是一个普通的表单项
if(fileItem.isFormField()) {
result.getParamMap().put(fileItem.getFieldName(),fileItem.getString("UTF-8"));
//如果不是表单的普通文本域,就是
} else {
result.getFileMap().put(fileItem.getFieldName(),fileItem);
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
最后我的保存文件流程就很简单了:
构建数据对象后直接就可以保存文件
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
if (ServletFileUpload.isMultipartContent(req)){
OperateUploadFileDTO dto = OperateUploadFileUtil.parseParam(req);
String fileName = dto.getParamMap().get("fileName");
FileItem item = dto.getFileMap().get("file");
try {
item.write(new File("H:/"+fileName));
} catch (Exception e) {
e.printStackTrace();
}
}
}