#前言
推荐讲解:使用ajax提交form表单,包括ajax文件上传
推荐讲解:HTML5+Ajax上传文件
建议:看这篇之前,请先了解直接form表单提交servlet方式上传文件 jsp上传文件到服务器,因为我下面servlet用的文件上传方式在里面有讲解,所以此篇不赘述。
#案例
前端jsp代码:
<div style="width: 60%;text-align: center;margin: 2% auto;">
<input id="myphoto" type="file" name="pic">
<button type="button" onclick="uploadFiles('myphoto','photo')">提交</button>
</div>
js代码实现uploadFiles函数,函数内执行ajax
/*** 上传文件 *****/
function uploadFiles(inputid,type) {
var formData=new FormData();
formData.append("file",$('#'+inputid).prop('files')[0]);
formData.append('type',type);
$.ajax({
type:'POST',
url:'/ServletUpload',
data:formData,
contentType: false,// 注意:让jQuery不要处理数据
processData: false,// 注意:让jQuery不要设置contentType
success:function (msg) {
console.log("上传成功");
window.location.reload();
},
error:function (mag) {
console.log("上传失败,请重试");
alert("上传失败,请重试");
// window.location.reload();
}
});
}
最后是servlet代码:
package Servlet;
import Beans.User;
import Mysql.SQL;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
@WebServlet(name = "ServletUpload",urlPatterns = {"/ServletUpload"})
public class ServletUpload extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
uploadFiles(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
return;
}
private void uploadFiles(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
PrintWriter out=response.getWriter();
String ret="No";
try {
// 配置上传参数
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
// 解析请求的内容提取文件数据
@SuppressWarnings("unchecked")
List<FileItem> formItems = upload.parseRequest(request);
//获取普通参数
Map<String ,String> field=new HashMap<>();
for (FileItem item : formItems){
if(item.isFormField()){
field.put(item.getFieldName(),item.getString());
}
}
String type=field.get("type");//我自己规定的类型,区分文件是干嘛的
int succ=0;
// 迭代表单数据
for (FileItem item : formItems) {
// 处理不在表单中的字段,即文件
if (!item.isFormField()) {
String fileName = item.getName(); //获取上传的文件名
String fileType=fileName.substring(fileName.lastIndexOf(".")+1);
//定义上传文件的存放路径
String path = request.getServletContext().getRealPath("/upload/"+type);
path=path.replace("\\","/");//一定要加上,不然路径在插入数据库时会出错
//定义上传文件的完整路径
String fileSaveName= new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()).toString();
fileSaveName+="."+fileType;
String filePath = String.format("%s/%s",path,fileSaveName);
File storeFile = new File(filePath);
//如果父目录不存在,就创建他
if(!storeFile.getParentFile().exists()){
storeFile.getParentFile().mkdirs();
}
// 在控制台输出文件的上传路径
System.out.println(filePath);
// 保存文件到硬盘
item.write(storeFile);
//以下是将路径信息插入数据库,不必关注
/******............******/
succ++; //多上传了一个文件
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
if(succ>0){
ret="Yes";
}
out.print(ret);
out.flush();
out.close();
}
}
如有错误,请帮我指正,谢谢