JavaWeb之servelt3.0注解形式的文件上传
原理
将客户端的文件以流的形式进行解析发送至服务器端并进行保存的过程称之为文件上传,很多前端框架都定义了这种上传的功能,大致分为几类,form表单形式,ajax形式
在servlet3.0之后可以将数据封装为part对象可以直接获取上传的文件数据,需要将servlet使用@MultipartConfig进行标识
书写
如果是基于form表单形式,那么在提交数据时需要修改表单的数据提交方式,将表达的数据以流的形式发送至服务器端,并且修改请求方式为post,否则不能进行上传。
1、书写form表单 修改提交方式method=“post”,数据发送方式enctype="multipart/form-data“这样提交的文件会在请求体中以流的形式发送至客户端
<!-- 提交方式post 提交数据形式multipart/form-data -->
<form action="/upload" method="post" enctype="multipart/form-data">
2、创建相应的文件域用于选择提交的文件
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="imgFile"><br>
<input type="submit" value="提交">
</form>
3、书写servlet,切记加入@MultipartConfig注解
package com.yunhe.servlet;
import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.UUID;
@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置编码
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset:utf-8");
Part imgPart = request.getPart("imgFile");
InputStream is = imgPart.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
// 填入上传到服务器的路径
File file = new File("F://Upload", UUID.randomUUID()+imgPart.getSubmittedFileName());
FileOutputStream fos = new FileOutputStream(file);
byte[] b = new byte[1024];
int len = 0;
while ((len = bis.read(b))!=-1){
fos.write(b,0,len);
}
bis.close();
fos.flush();
fos.close();
}
}
拓展:多文件上传
书写
1、jsp代码,在文件域添加multiple属性
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="imgFile" multiple><br>
<input type="submit" value="提交">
</form>
2、java代码
package com.yunhe.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.*;
import java.util.Collection;
import java.util.UUID;
@WebServlet("/upload")
//告诉服务器 这个servlet可以用来直接接收文件
@MultipartConfig
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
//可以直接通过name获取请求中的值
String username = request.getParameter("username");
//获取前台请求的所有文件(包含普通字段在内)
Collection<Part> parts = request.getParts();
for (Part p : parts) {
//普通字段封装为part对象数据为null
if(p.getSubmittedFileName()!=null){
InputStream inputStream = p.getInputStream();
BufferedInputStream bis=new BufferedInputStream(inputStream);
File file=new File("F://upload", UUID.randomUUID()+p.getSubmittedFileName());
FileOutputStream fos=new FileOutputStream(file);
byte [] b=new byte[2048];
int len=0;
while((len=bis.read(b))!=-1){
fos.write(b,0,len);
}
bis.close();
fos.flush();
fos.close();
}
}
}
}