package com.yc.util;
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);
}
}
}
}