文件上传

<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/upload1" enctype="multipart/form-data" method="post">
        <input type="text" name="username"><br>
        <input type="password" name="password"><br>
        <input type="file" name="image"><br>
        <input type="submit">
    </form>
</body>
</html>

问题的话,主要有两大类,

  1. 文件会有分隔符,导致文件损坏
  2. 获取请求参数的API不再适用,无法获取到普通form表单数据

原因都是因为添加了enctype=multipart/form-data,因为添加这个属性,使得请求体的数据结构发生了变更,所以获取请求参数的API不在适用,同时添加之后,会多出很多分隔符,所以文件中会包含有分隔符。

使用组件来进行文件上传

接下来的内容大家会觉得代码太多,而且不理解,记不住。不用去深究。

Spring。Spring会帮助你把这些步骤全部封装好,所以今后啥也不用干。

Commons-FileUpload组件

@WebServlet("/upload1")
public class UploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        //post里面写代码
        boolean result = ServletFileUpload.isMultipartContent(request);
        if(!result){
            response.getWriter().println("不包含上传的文件");
            return;
        }
        //result=true
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletContext servletContext = getServletContext();
        File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
        factory.setRepository(repository);

        // Create a new file upload handler
        ServletFileUpload upload = new ServletFileUpload(factory);
        //如果上传的文件名中文乱码,可以这么解决
        //upload.setHeaderEncoding("utf-8");
        // bytes  1024 bytes
        //upload.setFileSizeMax(1024);
        try {
            List<FileItem> items = upload.parseRequest(request);
            //对items进行迭代
            Iterator<FileItem> iterator = items.iterator();
            while (iterator.hasNext()){
                //每一个item其实就是一个input框的封装
                FileItem item = iterator.next();
                if(item.isFormField()){
                    //当前是普通的form表单数据
                    processFormField(item);
                }else{
                   //当前是上传的文件
                   processUploadedFile(item);
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
    }

    /**
     * 处理上传的文件逻辑
     * @param item
     */
    private void processUploadedFile(FileItem item) {
        String fieldName = item.getFieldName();
        String fileName = item.getName();
        System.out.println(fieldName + " === " + fileName);
        String realPath = getServletContext().getRealPath("upload/" + fileName);
        File file = new File(realPath);
        if(!file.getParentFile().exists()){
            file.getParentFile().mkdirs();
        }
        try {
            //保存文件到硬盘中
            item.write(file);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 处理普通的form表单数据
     * 只需要获取name和value值即可
     * 上传文件之后,不要再用getParameter去获取请求参数了
     * 有没有中文乱码问题呢?
     * @param item
     */
    private void processFormField(FileItem item) {
        String name = item.getFieldName();
        String value = null;
        try {
            value = item.getString("utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        System.out.println(name + " = " + value);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值