servlet 上傳檔案,下載檔案響應頭部設定
阿新 • • 發佈:2019-01-02
使用apache的開源jar編寫
編寫檔案上傳幫助類
/**
* 檔案上傳幫助類
*
* @author ajie
*
*/
public class FileUploadUtil {
/**
* 建立資料夾
*/
public static void exitsFile(String filePath) {
// 判斷如果資料夾不存在
if (!new File(filePath).isDirectory()) {
// 建立資料夾
new File(filePath).mkdirs();
}
}
/**
* 上傳檔案方法
*
* @param request
* 用於獲取專案名
* @param type
* 用於區分檔案型別
* @param userName
* 使用者名稱,區分檔案
* @return
* @throws Exception
*/
public static List<String> upload(HttpServletRequest request, String type, String userName) throws Exception {
// 用於獲取檔案路徑
List<String> list = new ArrayList<String>();
// 獲取專案上下文路徑
String contextPath = request.getContextPath().replaceAll("/", "");
// 拼接儲存檔案路徑
String path = ",webapps,files," + contextPath + "," + type + "," + userName;
// 獲取檔案路徑
String filePath = System.getProperty("catalina.base" ) + path.replace(',', File.separatorChar);
// 建立資料夾
FileUploadUtil.exitsFile(filePath);
System.out.println("檢視專案物理路徑----》》》" + filePath);
// 建立磁碟檔案專案工廠物件
DiskFileItemFactory fileFactory = new DiskFileItemFactory();
// 建立servlet檔案上傳物件
ServletFileUpload fileUpload = new ServletFileUpload(fileFactory);
// 設定檔案大小
fileUpload.setSizeMax(1024 * 1024 * 1024 * 5);
try {
// 獲取request所有引數
List item = fileUpload.parseRequest(request);
System.out.println("獲取的request引數值----》》》》" + item);
// 將list轉為迭代
Iterator iterator = item.iterator();
while (iterator.hasNext()) {
// 獲取單個檔案專案物件
FileItem fileItem = (FileItem) iterator.next();
// 判斷欄位不為普通欄位
if (!fileItem.isFormField()) {
System.out.println("檔案屬性名---》》》" + fileItem.getFieldName() + ",檔名----》》》》" + fileItem.getName()
+ ",檔案型別---》》》" + fileItem.getContentType() + ",是否為普通欄位---》》》" + fileItem.isFormField());
// 拼接檔案儲存位置
String strPath = "files/" + contextPath + "/" + type + "/" + userName + "/" + fileItem.getName();
list.add(strPath);
// 建立檔案物件
File file = new File(filePath + "/" + fileItem.getName());
// 在指定路徑寫入該檔案
fileItem.write(file);
} else {
throw new Exception("你個小子就是在瞎搞,會給你搞炸的。。。。。。");
}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
}
編寫上傳servlet
package com.javaketang.servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.RequestContext;
import org.apache.commons.fileupload.servlet.ServletRequestContext;
import com.javaketang.util.FileUploadUtil;
import net.sf.json.JSONObject;
/**
* 用於上傳檔案使用
*
* @author ajie
*
*/
public class FileUploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 封裝了很多request的操作,可以去看api
RequestContext requestContext = new ServletRequestContext(req);
// 設定請求響應編碼集
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
// 顯示在前臺資料
JSONObject json = new JSONObject();
// 提示資訊
String message = "";
// 判斷該表單為multipart型別
if (FileUpload.isMultipartContent(requestContext)) {
try {
// 獲取返回的檔案地址
List<String> strPath = FileUploadUtil.upload(req, "img", "admin");
message = "上傳成功,恭喜老表";
json.put("filePath", strPath);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
message = e.getMessage();
}
} else {
message = "上傳失敗,不是multipart請求資料型別";
}
json.put("message", message);
resp.getWriter().write(json.toString());
}
}
這裡使用form的multipart/form-data型別上傳圖片
配置web.xml
<!-- 檔案上傳servlet地址配置 -->
<servlet>
<servlet-name>file</servlet-name>
<servlet-class>com.javaketang.servlet.FileUploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>file</servlet-name>
<url-pattern>/file</url-pattern>
</servlet-mapping>
這裡沒有使用filter過濾器過濾編碼集,可以自己根據要求新增字元編碼過濾器
編寫檔案上傳fileUpload.jsp頁面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="../statics/js/jquery-1.7.2.min.js"></script>
<script type="text/javascript">
var util = {
file_upload:function file_upload(){
var obj = new FormData();
var file1 = document.getElementById("file1").files[0];
var file2 = document.getElementById("file2").files[0];
obj.append("file1",file1);
obj.append("file2",file2);
console.log("請求引數---》》》"+obj);
$.ajax({
url:'../file',
type:'POST',
data:obj,
contentType:false,
processData:false,
mimeType:'multipart/form-data',
success:function(data){
console.log(data);
}
})
}
}
</script>
</head>
<body>
<form action="../file" enctype="multipart/form-data" method="POST" >
<h2>基本form表單上傳檔案</h2>
檔案一:<input type="file" name="file1"/><br/>
檔案二:<input type="file" name="file2"/><br/>
<input type="submit" value="提交"/>
</form>
<div>
<h3>ajax上傳檔案</h3>
檔案一:<input type="file" id="file1" /><br/>
檔案二:<input type="file" id="file2"/><br/>
<input type="button" onclick="util.file_upload()" value="上傳提交">
</div>
</body>
</html>
使用兩種方式上傳檔案,form表單提交和ajax請求方式
jsp頁面執行效果:
上傳完成後執行效果:
form表單上傳效果如下:
ajax非同步上傳檔案效果:
下載檔案response響應頭部設定
下載檔案可以根據檔案型別進行設定reponse響應頭部,下載對應對應的檔案,這裡就不做介紹了,可以在
Tomcat的conf檔案中,找到web.xml,裡面有對應檔案型別的響應頭部設定:
下面是Excel響應頭部設定servlet程式碼:
package com.javaketang.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ExcelServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
// 設定Excel響應頭部,在請求該servlet時自動下載Excel檔案
resp.setContentType("application/vnd.ms-excel;charset=UTF-8");
// 設定響應頭部,啟用檔案下載對話方塊
resp.setHeader("Content-disposition", "attachment;filename=excel.xls");
// 建立PrintWriter 例項
PrintWriter excel = resp.getWriter();
// 這裡輸出的字串會在excel中
excel.write("this is excel");
excel.close();
}
}
web.xml配置下載servlet請求地址:
<!-- 下載servlet配置 -->
<servlet>
<servlet-name>download</servlet-name>
<servlet-class>com.javaketang.servlet.ExcelServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>download</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>
請求這個servlet,地址會被封裝為檔名稱,可以將其封裝為通用的下載servlet,需要編寫下載幫助類,
用於區分檔案型別,設定response響應頭部,下載後的excel如下圖:
可以根據自己實際需要設計下載和上傳檔案的編寫,如果有更好的方式可以相互討論學習,希望這個例項可以幫到大家