smartupload實現檔案的上傳、下載
import java.io.IOException;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.PageContext;
import com.jspsmart.upload.File;
import com.jspsmart.upload.Files;
import com.jspsmart.upload.Request;
import com.jspsmart.upload.SmartUpload;
import com.jspsmart.upload.SmartUploadException;
public class UploadUtil {
private static final String PATH = "images"; // 儲存圖片的資料夾
private static final String ALLOWED = "gif,jpg,png,jpeg"; // 可以上傳的檔案型別
private static final String DENIED = "exe,bat,jsp,html,com"; // 不可以上傳的檔案型別
private static final int TOTALMAXSIZE = 20 * 1024 * 1024; // 最多上傳的大小
private static final int SINGLEFILESIZE = 1024 * 1024; // 最多單個檔案在小
/**
* 用於從頁面上下文中讀取到request請求中傳過來的字串引數及檔案引數
*
* @param context
* :頁面上下文
* @return Map 鍵值 name-> 張三
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public Map<String,String> upload(PageContext context){
SmartUpload su = new SmartUpload();
// File f=null; //臨時變數用來存每個上傳的檔案, 不是io中的,而是smartupload
// 開始取出頁面所有傳來的字元引數
Map<String, String> params = new HashMap<String, String>();
// 初始化
try {
su.initialize(context);
// 設定引數
su.setAllowedFilesList(ALLOWED);// 設定允許上傳的檔案(通過副檔名限制)
su.setDeniedFilesList(DENIED); //設定禁止上傳的檔案(通過副檔名限制)
su.setCharset("utf-8");
su.setTotalMaxFileSize(TOTALMAXSIZE); // 限制總上傳資料的長度。
su.setMaxFileSize(SINGLEFILESIZE);
su.upload();// 開始接收上傳
//int count = su.save("/upload"); // 將上傳檔案全部儲存到指定目錄
//下載新建一個
//SmartUpload su = new SmartUpload();
//初始化
//su.initialize(pageContext);
//設定contentDispositio為null以禁止瀏覽器自動開啟檔案
//保證點選連結後是下載檔案。若不設定,則下載的副檔名為doc時,
//瀏覽器將自動用word開啟它。副檔名為pdf時,瀏覽器將用acrobat開啟。
//su.setContentDisposition(null);
// 載檔案
//su.downloadFile("/upload/test.doc");
// 從su中取出封裝request
Request request = su.getRequest(); // 注意這個reqeust請滶物件是smartupload提供
Enumeration et=request.getParameterNames(); //獲取請求中的所有表單元素資訊
String str;
while(et.hasMoreElements()){
str=String.valueOf(et.nextElement());
params.put(str,request.getParameter(str));
}
// 取出上傳的檔案流
if (su.getFiles() != null && su.getFiles().getCount() > 0) {
Files fs = su.getFiles();
Collection<File> col = fs.getCollection();
String fname;
String picPath="";
for (File f : col) {
if (!f.isMissing()) { // 判斷檔案在上傳的過程中是否丟失
// 檔名有可能重複,所以不能用原檔名,必須重生成一個新檔名,
fname = PATH+"/"+new Date().getTime() + ""+ new Random().nextInt(10000)+"."+f.getFileExt(); // 取得原檔案的字尾名
System.out.println("檔案會儲存到:" + fname);
// 儲存
f.saveAs(fname, SmartUpload.SAVE_VIRTUAL);
picPath+=fname;
}
}
picPath+=picPath.substring(0,picPath.lastIndexOf(",")); //去掉最後的那個逗號
params.put("picPath",picPath); // 取出最後存的檔名,儲存到params
}
} catch (ServletException e) {
LogUtil.log.error(e.toString());
throw new RuntimeException(e);
} catch (IOException e) {
LogUtil.log.error(e.toString());
throw new RuntimeException(e);
} catch (SQLException e) {
LogUtil.log.error(e.toString());
throw new RuntimeException(e);
} catch (SmartUploadException e) {
LogUtil.log.error(e.toString());
throw new RuntimeException(e);
}
return params;
}
/**
* 檔案下載
* @param filePath:要下載的檔案路徑
* @param response:響應
* @param context:檔案上下文
*/
public void downLoadFile(String filePath, HttpServletResponse response,PageContext context){
try {
SmartUpload su=new SmartUpload();
su.initialize(context);
//設定contentDisposition為null以禁止瀏覽器自動開啟檔案
//保證點選連線後是下載檔案。若不設定,則下載的副檔名為doc時
//瀏覽器將自動用word開啟。副檔名為pdf時,瀏覽器將用acrobat開啟
su.setContentDisposition(null);
//下載檔案
su.downloadFile(filePath);
} catch (SmartUploadException e) {
LogUtil.log.error(e.toString());
throw new RuntimeException(e);
} catch (ServletException e) {
LogUtil.log.error(e.toString());
throw new RuntimeException(e);
} catch (IOException e) {
LogUtil.log.error(e.toString());
throw new RuntimeException(e);
} finally{
try {
response.getOutputStream().close();
} catch (IOException e) {
LogUtil.log.error(e.toString());
throw new RuntimeException(e);
}
}
}
}