【JavaWeb】文件上传

18 篇文章 0 订阅

【JavaWeb】文件上传

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();
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值