如何使用formData对象进行(同步或异步)文件的上传
2018-04-10 本文已影响109人
爱音乐的二狗子
通常,servlet应用中我们都是使用apche的common-fileupload.jar、common-io.jar进行文件的上传和下载。但我们在不使用第三方jar的情况下该如何实现文件的上传呢?h5标准出来后,我们可以借助formData对象结合Servlet3的特性实现文件的上传和下载。
jsp页面表单部分(直接form提交时的写法,大家懂的,记得引入JQuery库)
<form action="<%=request.getContextPath() %>/fileIOServlet" method="post" enctype="multipart/form-data">
项目sql文件:<input name="sqlfile" id="sqlfile" type="file" /><br>
项目war包:<input name="warfile" id="warfile" type="file" /><br>
<input name="handle" id="handle" type="hidden" value="upload"/>
<input type="submit" value="上传"/>
</form>
jsp页面表单部分(通过ajax提交时的写法)
<div id="upload">
项目sql文件:<input name="sqlfile" id="sqlfile" type="file" /><br>
项目war包:<input name="warfile" id="warfile" type="file" /><br>
<input name="handle" id="handle" type="hidden" value="upload"/>
<button id="submit" onclick="uploadFile()">上传</button>
</div>
Ajax 请求的js代码(这里只写关键代码,数据校验的请自行处理):
<script type="text/javascript">
var cp='<%=request.getContextPath() %>';
function uploadFile() {
if($("#sqlfile").val()==""||$("#sqlfile").val().lastIndexOf(".sql")==-1){
alert("请选择sql文件");
return false;
}
if($("#warfile").val()==""||$("#warfile").val().lastIndexOf(".war")==-1){
alert("请选择war文件");
return false;
}
var formData = new FormData();
formData.append("sqlfile",$("#sqlfile")[0].files[0]);
formData.append("warfile",$("#warfile")[0].files[0]);
formData.append("handle",$("#handle").val());
$.ajax({
url: '<%=request.getContextPath() %>/fileIOServlet',
type: 'post',
data: formData,
async: false,
cache: false,
contentType: false,
processData: false,
success: function (returndata) {
$("#sqlfile").val("");
$("#warfile").val("");
$("#icofile").val("");
alert("文件上传成功!");
},
error: function (returndata) {
alert("文件上传出错!");
}
});
}
<script>
下面是Servlet处理上传文件的共用代码:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Collection;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.MultipartConfig;
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;
@WebServlet("/fileIOServlet")
@MultipartConfig
public class FileIOServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private String sperator = File.pathSeparator;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String handle = request.getParameter("handle");
if ("upload".equals(handle)) { //这里仅是逻辑的处理,大家可根据实际情况进行修改
upload(request, response);
}
/**
* @param request
* @param response
*/
private void upload(HttpServletRequest request, HttpServletResponse response) {
//这里我将sql文件和war包放到项目之外的不同目录,保存路径大家自己设置,谢谢
String sqlPath = "F:\\PackageUtil\\packaged\\";
String warPath = "F:\\PackageUtil\\packaged\\tomcat-7.0.63\\webapps\\";
try {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String fileName = "";
String header = "";
Collection<Part> parts = request.getParts();
if (null == parts) {
//
}
File f = null;
String sqlfix = "^.*[.sql]$";//以".sql"结尾的文件
String warfix = "^.*[.war]$";//以".war"结尾的文件
for (Part part : parts) {
if ("sqlfile".equals(part.getName())) {
header = part.getHeader("Content-Disposition");
fileName = getFileName(header);
f = new File(sqlPath);
//删除同目录下同一类型的文件,如果没有这个需求可将如下标注的代码段删掉
//begin----------------------删掉-----------------------------
File fileList[] = f.listFiles();
for (File file : fileList) {
if (file.isFile()) {
if (file.getName().matches(sqlfix)) file.delete();
}
}
//end----------------------删掉-----------------------------
part.write(sqlPath + fileName);
}
else if ("warfile".equals(part.getName())) {
header = part.getHeader("Content-Disposition");
fileName = getFileName(header);
f = new File(warPath);
//删除同目录下同一类型的文件,如果没有这个需求可将如下标注的代码段删掉
//begin----------------------删掉-----------------------------
File fileList[] = f.listFiles();
for (File file : fileList) {
if (file.isFile()) {
if (file.getName().matches(warfix)) file.delete();
}
}
//begin----------------------删掉-----------------------------
part.write(warPath + fileName);
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
* 文件下载
*/
private void download(HttpServletRequest request, HttpServletResponse response) {
File fIn = new File("F:\\PackageUtil\\Output\\setup.exe");
FileInputStream inputStream = null;
ServletOutputStream out = null;
response.setContentType("application/octet-stream");
try {
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileNameString, "UTF-8"));
inputStream = new FileInputStream(fIn);
out = response.getOutputStream();
int temp = 0;
byte[] bArray = new byte[1024];
while ((temp = inputStream.read(bArray)) != -1) {
out.write(bArray, 0, temp);
}
inputStream.close();
out.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
* @param header
* @return
*/
private String getFileName(String header) {
return header.split("=")[2].replaceAll("\"", "");
}
}
更多内容请查看官网:https://docs.oracle.com/javaee/7/tutorial/servlets016.htm#BABDGFJJ
谢谢关注与支持!