【JavaWeb】文件上传
1、概念
文件上传顾名思义就是把前端用户传入的文件可以上传到服务器,一般上传的文件保存有俩种方法,一种是直接以二进制文件存在数据库。还有就是将文件存在服务器的文件夹中
- 如果直接将文件存在数据库,因为数据库的大小是有限制,所以不方便
- 所以一般会采用把文件存在服务器上的某个路径
2、实现上传文件
实现上传文件,第一步需要在前端的form表单中设置enctype属性,将该属性设置为
multipart/form-data
表示该表单支持二进制的传输,然后在后端接收二进制文件即可。
<form method="post" action="addMusicServlet" class="form-horizontal" enctype="multipart/form-data">
在后端接收二进制文件的方式有很多,可以使用第三方jar
apache 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();