在客户端要是实现文件上传,在form表单中要设置enctype的属性
<form method="post" enctype="multipart/form-data">
<input type="file" name="filename"></input>
<input type="submit" value="upload"></input>
</form>
在H5中我们只需要这样就可以生成一个可供选择多个文件的按钮
<input type="file" multiple></input>
在服务器上
主要是围绕MultipartConfig注解和javax.servlet.http.Part接口进行
MultipartConfig属性可以有如下几种,maxFileSize,maxRequestSize,location文件保存到磁盘指定位置,fileSizeThreshold指定溢出尺寸
HttpServletRequest定义了如下几个方法来处理多部分请求
Part getPart(String name);
Collection<Part> getParts();
String getName();
String getContentType();
getHeaderNames();
最终要的write(String path)
void delete()等等
这将以InputStream的形式返回长串文件的内容,如果html是一个文件的input元素,则Part将放回如下标头
如果输入域中名位document的note.txt
content-type:text/plain
context-disposition:form-data; name="document"; filename="note.txt"
对于非文本域,part将只返回如下标头
content-disposition:form-data;name“fieldame”
在Servlet处理上传文件是将采用如下步骤:
1.查看是否存在content-type标头,检验一个Part是普通的表单域还是文件域,我们可以调用getContentType()或者getHeader("content-type")来完成检查
2.如果有content-type标头,产看上传的文件是否为空,如果文件名是空的华就代表有文件类型的域存在但是没有要上传的文件
3.如果有文件的存在,就可以调用Part的write方法来写入磁盘
例如在服务器端
我们可以在doPost方法中这样操作
request.getPart("name");
getFileName(part)
这个函数可以这样来写
private String getFileName(Part part){String contentDispositionHeader = part.getHeader("content-disposition");
String[] elements = contentDispositionHeader.split(";");
for(String element:elements){
if(element.startsWith("filename")){
return element.substring(element.indexOf("=")+1).trim().replace("\"", "");
}
}
return null;
}
然後調用part的write方法將文件寫入到磁盤中去