Tomcat学习笔记(7)--FormData文件上传与后台接收

开学半个月终于从开学期末粥和班级事务中解脱开了,累死,还是沉浸在代码世界宁静一些。

这一章本身与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();
            }

        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值