Web学习---文件上传

这篇博客主要介绍了在Web开发中实现文件上传的步骤和注意事项,包括前端表单设置,使用multipart/form-data,设置唯一文件名,限制文件大小和类型。在Java后端,提到了使用DiskFileItemFactory和ServletFileUpload处理文件上传,并解决了一个关于请求内容类型的报错问题,原因是未正确设置请求编码为utf-8。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前端页面的设置
1、表单的请求方式必须是post
2、表单提交的类型 enctype=”multipart/form-data”
3、上传控件 file类型 必须得写name属性:
需要用到第三方库
文件上传注意事项:
1、为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如web-inf目录。2、为防止文件覆盖的现象发生要为上传文件产生一个唯一的文件名3、限制上传文件的最大值可以用UUID,MD5等方式产生一个不重复的字符串
4、可以限制上传文件的类型,在收到上传文件名时,判断后缀是否合法

需要导入的包
commons-fileupload-xx.jar commons-io-xx.jar
maven添加依赖

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>

1、判断是否为上传文件的表单类型
2、创建DiskFileItemFactory 对象,处理文件上传文件路径,或者大小限制

 DiskFileItemFactory factory = new DiskFileItemFactory();
        factory.setRepository(upLoadFile);
        //设置缓冲区
        factory.setSizeThreshold(1024*1024);

3、获取ServletFileUpload,创建上传核心类

        ServletFileUpload servletFileUpload = new ServletFileUpload(factory);

4、获取对象

List<FileItem> fileItems = servletFileUpload.parseRequest(req);
for (FileItem fileItem : fileItems){
  InputStream inputStream = fileItem.getInputStream();
                    //创建一个文件输出流
FileOutputStream fos = new 
//创建一个输出流
FileOutputStream(realPath+"/"+uuidpath+fileExName);
//输出
fos.write();
//关闭流
fos.close();
inputStream.close();
}

报错:
the request doesn’t contain a multipart/form-data or multipart/mixed stream, content type header is application/x-www-form-urlencoded
排查后,发现是因为没有把req变为utf-8编码
解决了问题


import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
import java.util.UUID;

public class uploadServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //
        System.out.println("进入dopost");
          //1、判断是否为上产文件的表单类型,如果不是,直接结束
        if (!ServletFileUpload.isMultipartContent(req)) {
            return ;
        }

        String upLoadPath =this.getServletContext().getRealPath("WEB-INF/upload");
        File upLoadFile = new File(upLoadPath);
        if(!upLoadFile.exists())
            upLoadFile.mkdir();


        //缓存,临时文件
        //临时路径,如果文件超过预期,放入临时文件目录,一定时间后删除

        // 1.配置DiskFileItemFactory
        DiskFileItemFactory factory = new DiskFileItemFactory();


        factory.setRepository(upLoadFile);
        //设置缓冲区
        factory.setSizeThreshold(1024*1024);
        // 2.创建上传核心类
        ServletFileUpload servletFileUpload = new ServletFileUpload(factory);

        try {

            List<FileItem> fileItems = servletFileUpload.parseRequest(req);
            for (FileItem fileItem : fileItems) {
                // 判断表单类型
                if (fileItem.isFormField()) {
                    // 普通表单
                    String name = fileItem.getFieldName();
                    String value = fileItem.getString("utf-8");
                    //map.put(name, value);
                    System.out.println(name+"  "+value);

                } else {
                    // 处理文件
                    String uploadFileName = fileItem.getName();
                    //存在文件名不合法的情况
                    if(uploadFileName.trim().equals("")||uploadFileName==null){
                        continue;
                    }
                    //获得上传的文件名,
                    String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);
                    //获得文件后缀名
                    String fileExName= uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);

                    String uuidpath= UUID.randomUUID().toString();

                    String realPath  = upLoadPath+"/"+uuidpath;
                    //给每个文件创建一个对应的文件夹
                    File reaPathFIle = new File(realPath);
                    if(!reaPathFIle.exists()){
                        reaPathFIle.mkdir();
                    }
//                    文件传输
                    //获得文件上传的流
                    InputStream inputStream = fileItem.getInputStream();

                    //创建一个文件输出流
                    FileOutputStream fos = new FileOutputStream(realPath+"/"+uuidpath+fileExName);

                    //realPath = 真的文件夹
                    //创建一个缓冲区
                    byte[] buffer = new byte[1024*1024];
                    int len = 0;
                    //判断是否读取完毕
                    while((len = inputStream.read(buffer))>0){
                        fos.write(buffer);
                    }
                    fos.close();
                    inputStream.close();
                    fileItem.delete();

                }
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        PrintWriter writer = resp.getWriter();
        writer.write("成功");
        System.out.println("结束");
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值