当提交表单里包含文件上传的时候,即Form的enctype属性值为multipart/form-data时,后台是无法像普通表单那样通过
这时候,当然可以通过解析提交到服务器的数据流来得到数据了,但是这样不但麻烦而且容易出错。
最好的方式是使用第三方的jar包获取数据,这方面有很多现成的成熟优秀的jar包。最常用的时以下三个:
apache的commons-fileupload : http://commons.apache.org/fileupload/
O'Reilly的cos:http://www.servlets.com/cos/index.html
jspsmart的SmartUpload:https://www.cnblogs.com/bhlsheji/p/4390795.html
我用的是commons-fileupload,目前主要使用这个java组件多一些,并且也相对稳定一些
一.部署
1.把commons-fileupload-1.2.1.jar和commons-io.jar导入到WEB-INF/lib下,IDE会自动进行配置
二.实例演示
1.自己看代码,都有相关注释,ajax部分
function insertintoSumbit(){
//与传统的ajax请求区别就在于传输的数据类型不同
var formData = new FormData(document.getElementById("insertFrom"));//必须是new FormData后台才能接收到
formData.append("orp", "insertinto");
$.ajax({
"url" : "servlet/FileUploadControl.do",
"type" : "post",
"data" : formData,
"async": false,
"cache": false,
"contentType": false,//必须false才会自动加上正确的Content-Type
"processData": false,//必须false才会避开jQuery对 formdata 的默认处理,XMLHttpRequest会对 formdata 进行正确的处理
"success" : function(result) {
if(result){
alert("新增成功");
colse();
Pagingben("",1);
}else{
alert("新增失败");
}
}
});
}
2.编码方面的工具部分
package com.H2SIMS.util;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import sun.misc.BASE64Encoder;
public class DownLoadUtils {
public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {
if (agent.contains("MSIE")) {
// IE浏览器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
}
3.servlet核心代码
@SuppressWarnings({ "unchecked" })
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String orp = null;
if (ServletFileUpload.isMultipartContent(request)) {
//System.out.println("是multipart类型");
//文件名
String uploadFileName = "";
//文件保存路径(项目根目录下的路径)
String uploadFilePath = request.getSession().getServletContext()
.getRealPath("upload/");
//创建临时文件目录路径
File tempPatchFile = new File("d:\\temp\\");
if (!tempPatchFile.exists()) {
tempPatchFile.mkdir();//如果文件未创建,就创建一个文件夹
}
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置缓冲区大小4kb
factory.setSizeThreshold(4096);
//设置上传文件用到临时文件存放路径
factory.setRepository(tempPatchFile);
ServletFileUpload upload = new ServletFileUpload(factory);
//设置单个文件的最大限制
upload.setSizeMax(1024 * 300);
List<FileItem> items;
try {
//从request中拿到文件流
items = upload.parseRequest(request);
for (FileItem fileItem : items) {
if (!fileItem.isFormField()) { //文件表单字段
String fileName = fileItem.getName();
//通过Arrays类的asList()方法创建固定长度的集合
List<String> filType = new ArrayList<String>();
filType.add("jpg");
filType.add("bmp");
filType.add("gif");
filType.add("webp");
String ext = fileName.substring(fileName
.lastIndexOf(".") + 1);//字符串截取
if (!filType.contains(ext)) //判断文件类型是否在允许范围内
out.print("上传失败,文件类型只能是gif、bmp、jpg、webp");
else {
if (fileName != null && !fileName.equals("")) {
File fullFile = new File(fileItem.getName());
// 将文件保存到服务器上(UUID是通用唯一标识码,不用担心会有重复的名字出现)
File saveFile = new File(uploadFilePath,UUID.randomUUID()+"_"+fullFile.getName());
fileItem.write(saveFile);
uploadFileName = saveFile.getName();//获取文件名
/*out.print("上传成功后的文件名是:" + uploadFileName
+ ",文件大小是:" + fileItem.getSize()
+ "bytes!");*/
//uploadFilPathString = saveFile.getAbsolutePath();//获取文件绝对路径
}
}
}else {
//表单非文件字段,取值方式与普通的ajax请求不同,getFieldName()方法用于获取表单字段的name属性值
//getString()用于获取value值
if(fileItem.getFieldName().equals("orp")){
orp=fileItem.getString();
break;
}
}
}
if (orp.equals("insertinto")) {
standard standard = new standard();
standard.setPackage_path(uploadFileName);
for (FileItem fileItem : items) {
if (fileItem.isFormField()) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
if (fileItem.getFieldName().equals("std_num")) {
standard.setStd_num(fileItem.getString("utf-8"));//设置编码
}
if (fileItem.getFieldName().equals("zhname")) {
standard.setZhname(fileItem.getString("utf-8"));
}
if (fileItem.getFieldName().equals("version")) {
standard.setVersion(fileItem.getString("utf-8"));
}
if (fileItem.getFieldName().equals("keys")) {
standard.setKeys(fileItem.getString("utf-8"));
}
if (fileItem.getFieldName().equals("release_date")) {
standard.setRelease_date(format.parse(fileItem.getString()));
}
if (fileItem.getFieldName().equals("impl_date")) {
standard.setImpl_date(format.parse(fileItem.getString()));
}
}
}
boolean insertinto = service.insertinto(standard);
if (insertinto) {
out.print(insertinto);
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}else {
}
out.flush();
out.close();
}