JavaWeb学习笔记-14文件上传

Posted Moon&&Dragon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb学习笔记-14文件上传相关的知识,希望对你有一定的参考价值。

文件上传

1、概念

文件上传顾名思义就是把前端用户传入的文件可以上传到服务器,一般上传的文件保存有俩种方法,一种是直接以二进制文件存在数据库。还有就是将文件存在服务器的文件夹中

  • 如果直接将文件存在数据库,因为数据库的大小是有限制,所以不方便
  • 所以一般会采用把文件存在服务器上的某个路径

2、实现上传文件

实现上传文件,第一步需要在前端的form表单中设置enctype属性,将该属性设置为multipart/form-data表示该表单支持二进制的传输,然后在后端接收二进制文件即可。

<form method="post" action="addMusicServlet" class="form-horizontal" enctype="multipart/form-data">

在后端接收二进制文件的方式有很多,可以使用第三方jarapache commons来实现。

在servlet3.0版本后,可以直接使用part来获取文件的二进制,但是不能获得文件名,可以通过获得请求头来获得文件名

  • 在使用part的方式来获取文件前,需要在该servlet标注注解@MultipartConfig表示该servlet支持part

    @MultipartConfig
    @WebServlet("/addMusicServlet")
    public class AddMusicServlet extends HttpServlet {...}
    
  • 获取文件名

    获得请求头信息: form-data; name=“file”; filename=“123.mp3”

    // 通过请求获得part
    Part file = req.getPart("file");
    // 通过part获得请求头
    String header = file.getHeader("Content-Disposition");
    

    处理请求头: 123.mp3

    // 获取最后一个"="后面的内容
    String fileName = header.substring(header.lastIndexOf("=")+1);
    // 处理调俩面双引号
    fileName = fileName.substring(1,fileName.length()-1);
    
  • 使用IO流将文件读写到磁盘

    设置读写地址,获取输出流

    // File.separator 分隔符
    File file = new File("/Users/xiaolong/Desktop"+File.separator+"MP3");
    // 判定文件夹是否存在
    if (!file.exists()){
      boolean mkdirs = file.mkdirs();
    }
    // 获得输出流,在file目录先创建叫fileName的文件
    FileOutputStream out = new FileOutputStream(new File(file,fileName));
    

    通过part获得文件的二进制输入流

    // 获取用户上传的输入流
    InputStream in = part.getInputStream();
    

    读写

    // 读写
    byte[] buffer = new byte[1024];
    int len;
    while ((len=in.read(buffer))!=-1){
      out.write(buffer,0,len);
    }
    // 关闭流
    in.close();
    out.close();
    
  • 获得文件大小的方法有俩种,一种是在进行读写操作的时候,直接在while循环中进行累加。另一种就是等传输完毕后,获得传输后的文件的length

    // 获得文件上传location
    String location = file.getPath()+fileName;
    Long size = new File(location).length();
    

以上是关于JavaWeb学习笔记-14文件上传的主要内容,如果未能解决你的问题,请参考以下文章

javaweb VUE+ElementUI 文件上传 后端部分

JavaWeb学习—— 文件上传下载

Javaweb学习笔记--分层设计

JavaWeb学习 (二十八)————文件上传和下载

JavaWeb学习总结(五十)——文件上传和下载

JavaWeb IO流实现文件上传下载