一、Struts1 ajax上传文件
input框
ajax请求(注意需要使用支持FormData对象的jquery版本)
FormData 对象的在jquery中使用
1.创建:var formData = new formData();
2.添加键值对:formData.append('key','value');
formData.append("formFile",$('#fileId')[0].files[0]);
3.发送数据:
$.ajax({
url:"<%=request.getContextPath()%>/impDataAction.do?type=uploadFile",
type: "POST",
data: formData,
processData : false, // 告诉jQuery不要去处理发送的数据(必须设置)
contentType : false, // 告诉jQuery不要去设置Content-Type请求头(必须设置)
success: function(data) {
alert("ok");
},
error: function(request) {
alert("Connection error");
}
});
}
Struts配置:
action配置,重点在于impDataForm与ImpDataAction
java代码:
if(StringUtils.equals(getParameter("type", request), "uploadFile")){
try {
FormFile formFile = impDataForm.getFormFile();
InputStream in = formFile.getInputStream();
FileOutputStream out = new FileOutputStream("D:/Users/uniz/Desktop/test/"+formFile.getFileName());
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
}
in.close();
out.close();
} catch (Exception e) {
}
return WebUtil.NULLActionForward;
}
二、Ajax + Servlet + 上传进度条
需要jar包
commons-fileupload
commons-fileupload
1.3.3
commons-io
commons-io
2.6
jsp&ajax&上传进度条
<%@ page contentType="text/html;charset=UTF-8"%>
<%@ page language="java"%>
Insert title here
<%@ include file="/app/common/head.jsp"%>
servlet
package com.study.file;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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 org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.servlet.ServletRequestContext;
import org.apache.commons.lang.StringUtils;
import com.study.json.JSONUtils;
import com.study.json.ReponseJSONBuilder;
import com.study.util.WebUtils;
/**
* 特别注意,上传文件遇到异常时,浏览器端接收不到异常信息。
* 原因是上传文件时浏览器请求持续时间长(文件未上传完),发生异常后,服务器虽然立即捕获异常并响应给浏览器,
* 但是浏览器仍然在发送上传请求,接收不到异常信息。
* @author uniz
*/
@WebServlet("/UploadServlet")
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// 上传文件存储目录
private static final String UPLOAD_DIRECTORY = "uploadDir";
// 上传配置
private static final int MEMORY_THRESHOLD = 1024 * 1024 * 300*3; // 300MB
private static final int MAX_FILE_SIZE = 1024 * 1024 * 400*3; // 400MB
private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 500*3; // 500MB
/**
* 上传数据及保存文件
*/
@SuppressWarnings("rawtypes")
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
if(isAjax(request)) {
try {
Map result = uploadHander(request);
WebUtils.writeJson(response, ReponseJSONBuilder.buildSuccessMsg(JSONUtils.toJSONString(result)));
} catch (Exception e) {
e.printStackTrace();
WebUtils.writeJson(response, ReponseJSONBuilder.buildErrorMsg(e));
}
return ;
}else {
Map result = uploadHander(request);
request.setAttribute("uploadFlag", MapUtils.getBooleanValue(result, "uploadFlag"));
request.setAttribute("message", MapUtils.getString(result, "uploadMsg")
+ " uploadFiles = " + MapUtils.getString(result, "uploadFiles") + "");
request.getRequestDispatcher("/uploadfile/message.jsp").forward(request, response);
}
}
private void checkUploadFile(HttpServletRequest request) throws Exception {
ServletRequestContext ctx = new ServletRequestContext(request);
long requestSize = ctx.contentLength();
if(requestSize > MAX_REQUEST_SIZE) {
throw new Exception("上传文件大小超过最大允许值!");
}
if (!ServletFileUpload.isMultipartContent(request)) {
throw new Exception("只能 multipart/form-data 类型数据");
}
}
private boolean isAjax(HttpServletRequest req) {
boolean isAjaxRequest = false;
if("XMLHttpRequest".equalsIgnoreCase(req.getHeader("x-requested-with"))){
isAjaxRequest = true;
}
return isAjaxRequest;
}
@SuppressWarnings({ "unchecked", "rawtypes" })
private Map uploadHander(HttpServletRequest request) {
List