文件上传与下载Apache的Servlet实现

package cn.com.infcn.server.qyqz;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import cn.com.infcn.common.jdbc.SqlOperate;

@SuppressWarnings("serial")
public class Upload {
File tempPathFile;
/**
* 文件上传
* @param request
* @param response
* @return
* @throws UnsupportedEncodingException
*/
@SuppressWarnings("unchecked")
public String fileUpload(HttpServletRequest request, HttpServletResponse response,String uuid) throws UnsupportedEncodingException {
response.setCharacterEncoding("utf-8");
request.setCharacterEncoding("utf-8");
String result = "fail";
String errortype[] = { ".exe", ".com", ".cgi", ".asp" };
String theTrueName[] = new String[1];
SimpleDateFormat dateformat = new SimpleDateFormat("yyyy\\MM\\dd\\HH");
String pathdir = "\\uploadfile\\qyqz\\"+ dateformat.format(new Date());//构建文件保存的目录
//得到图片保存目录的真实路径
String uploadPath = request.getSession().getServletContext().getRealPath(pathdir);
File savedir = new File(uploadPath);
if(!savedir.exists()) savedir.mkdirs();//如果目录不存在就创建
String tempPath = uploadPath + "\\temp";
File tempPathFile = new File(tempPath);
if (!tempPathFile.exists()) {
tempPathFile.mkdirs();
}
try {
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();

// Set factory constraints
factory.setSizeThreshold(4096); // 设置缓冲区大小,这里是4kb
factory.setRepository(tempPathFile);// 设置缓冲区目录

// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);

// Set overall request size constraint
upload.setSizeMax(4194304); // 设置最大文件尺寸,这里是4MB

List<FileItem> items = upload.parseRequest(request);// 得到所有的文件
Iterator<FileItem> it = items.iterator();
File fullFile = null;
String uuidname =null;
String type = null;
String realname = null;
while (it.hasNext()) {
FileItem fileitem = (FileItem) it.next();
// 如果这个fileitem对象的FiledName是四个以上的字符,并前四个字符是file,并且不是上传的文件元素的话,那就是三个hidden对象中的一个了
if (fileitem.getFieldName().length() > 2
&& "groupid".equals(fileitem.getFieldName()) && fileitem.isFormField()) {
// 设置对应的文件名,由于参数名的最后一位是从1开始的,所以减一.
theTrueName[0] = fileitem.getString();
}

// 判断文件名当中是否有不合法的文件的后缀
for (int i = 0; i < errortype.length; ++i) {
for (String name : theTrueName) {
// 有时可能只有一个文件上传,其他两个的文件名值会为null,为避免空指针异常,加上如下判断。
// 当name为null时,跳出循环.
if (name == null)
break;
if (name.endsWith(errortype[i])) {
// 如果有就抛异常
throw new Exception(name + " is wrong type");
}
}
}
String fileName = fileitem.getName();
if (fileName != null && fileitem.getFieldName().equals("uploadfile")) {
fullFile = new File(fileitem.getName());
realname = fullFile.getName();
type = getFileTailName(realname);
uuidname = UUID.randomUUID().toString()+ "."+type;
File savedFile = new File(uploadPath, uuidname);
fileitem.write(savedFile);
//fileitem.delete();
}

}

String path = pathdir + "\\" + uuidname;
UploadForm uploadForm = new UploadForm();
uploadForm.setGroupid(theTrueName[0]);
uploadForm.setUuid(uuid);
uploadForm.setRealname(realname);
uploadForm.setUuidname(uuidname);
uploadForm.setType(type);
uploadForm.setPath(path);
//执行保存操作
saveUploadFile(uploadForm);
request.setAttribute("groupid", theTrueName[0]);
result = "success";
} catch (Exception e) {
result = "sizeerror";
//e.printStackTrace();
}
System.out.println(result);
return result;
}

/**
* 文件下载
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
public void downLoad(HttpServletRequest request,
HttpServletResponse response,String fileid) throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
request.setCharacterEncoding("utf-8");
UploadForm uploadForm = getUploadById(fileid);
String fileRoot = request.getSession().getServletContext().getRealPath("");
String filepath = uploadForm.getPath();
String fullFilePath = fileRoot + filepath;
/* 读取文件 */
File file = new File(fullFilePath);
/* 如果文件存在 */
if (file.exists()) {
response.reset();
response.setContentType("application/x-msdownload;");
response.addHeader("Content-Disposition", "attachment; filename=\""+ uploadForm.getUuidname()+ "\"");
int fileLength = (int) file.length();
response.setContentLength(fileLength);
/* 如果文件长度大于0 */
if (fileLength != 0) {
/* 创建输入流 */
InputStream inStream = new FileInputStream(file);
byte[] buf = new byte[4096];
/* 创建输出流 */
ServletOutputStream servletOS = response.getOutputStream();
int readLength;
while (((readLength = inStream.read(buf)) != -1)) {
servletOS.write(buf, 0, readLength);
}
inStream.close();
servletOS.flush();
servletOS.close();
}
}
}

// 取得文件后缀名
private String getFileTailName(String fullName) {
String tailName = "";
//int begin = fullName.lastIndexOf(".");
tailName = fullName.substring(fullName.length()-3, fullName.length());
return tailName;
}

// 取得文件名字
private String getFileName(String fullName) {
String fileName = "";
int begin = fullName.lastIndexOf("\\");
fileName = fullName.substring(begin + 1, fullName.length());
return fileName;
}

public boolean deleteLoadFile(HttpServletRequest request,long fileid){


UploadForm uploadForm =getUploadById(String.valueOf(fileid));
Connection conn = null;
Statement st = null;
ResultSet rs = null;
boolean defaultCommit = false;
SqlOperate sqloperate = new SqlOperate();
String sql = "delete from EKP_RESOURCESHARING where id=?";
int rowCount = 0;
try {
conn = sqloperate.connectDatabase("");
defaultCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setLong(1, fileid);
rowCount = pstmt.executeUpdate();
if(rowCount==0){
return false;
}
conn.commit();
File file = new File(request.getSession().getServletContext().getRealPath("")+uploadForm.getPath());
if(file.exists()){
file.delete();
}
} catch (Exception e) {
rowCount = 0;
sqloperate.rollbackJdbc(conn);
} finally {
sqloperate.closeJdbc(conn, st, rs, defaultCommit);
}
return true;
}

public void findUploads(HttpServletRequest request,
HttpServletResponse response,String groupid) {
int PAGESIZE =5;
String crrentpage = request.getParameter("currentPage");
int curpage = 1;
if (crrentpage != null && !"".equals(crrentpage.trim())) {
try {
curpage = Integer.parseInt(crrentpage);
} catch (NumberFormatException e) {
return;
}
}
Map<String, Object> map = new HashMap<String, Object>();
long totleCounts = 0;

PageUtil pageUtil = null;
// 得到查询结果
List<UploadForm> list = getUploadList(groupid, curpage, PAGESIZE);
totleCounts = count(groupid);
pageUtil = new PageUtil((int)totleCounts, PAGESIZE);
map.put("resList", list);//resList
pageUtil.setCurpage(curpage);
map = pageUtil.setPageDate(map);
map.put("forward","qyqz/resourcesharing_list.jsp");
Iterator it = map.keySet().iterator();
while (it.hasNext()) {
Object key = it.next();
request.setAttribute((String)key, map.get(key));
}
request.setAttribute("crrentpage", curpage);
request.setAttribute("groupid", groupid);
}

private int saveUploadFile(UploadForm uploadForm){
Connection conn = null;
Statement st = null;
ResultSet rs = null;
boolean defaultCommit = false;
SqlOperate sqloperate = new SqlOperate();
String sql = "insert into EKP_RESOURCESHARING (id,uuid,groupid,realname,uuidname,type,path,ttime) values (EKP_RESOURCESHARING_SEQ.nextval,?,?,?,?,?,?,?)";
int rowCount = 0;
try {
conn = sqloperate.connectDatabase("");
defaultCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, uploadForm.getUuid());
pstmt.setString(2, uploadForm.getGroupid());
pstmt.setString(3, uploadForm.getRealname());
pstmt.setString(4, uploadForm.getUuidname());
pstmt.setString(5, uploadForm.getType());
pstmt.setString(6, uploadForm.getPath());
pstmt.setTimestamp(7, uploadForm.getTtime());
rowCount = pstmt.executeUpdate();
if(rowCount==0){
return 0;
}
conn.commit();
} catch (Exception e) {
rowCount = 0;
e.printStackTrace();
sqloperate.rollbackJdbc(conn);
} finally {
sqloperate.closeJdbc(conn, st, rs, defaultCommit);
}

return rowCount;
}
/**
* 返回下载列表
* @param groupid
* @param curpage
* @param pageSize
* @return
*/
public List<UploadForm> getUploadList(String groupid,int curpage,int pageSize){

Connection conn = null;
Statement st = null;
ResultSet rs = null;
boolean defaultCommit = false;
List<UploadForm> list = new ArrayList<UploadForm>();
SqlOperate sqloperate = new SqlOperate();
String sql = "SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT t11.id,t12.realname as uuid,t11.groupid,t11.realname,t11.uuidname,t11.type,t11.path,t11.ttime FROM EKP_RESOURCESHARING t11,isunuserinfo t12 where t11.groupid="+groupid+" and t11.uuid=t12.uuid"
+ " order by ttime desc) A WHERE ROWNUM <="
+ (curpage * pageSize)
+ ") WHERE RN >= "
+ ((curpage - 1) * pageSize + 1) + " order by ttime DESC";

try {
conn = sqloperate.connectDatabase("");
defaultCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
st = sqloperate.getStatement(conn);
rs = sqloperate.execQuery(st, sql);

while(rs.next()){
UploadForm uploadForm = new UploadForm();
uploadForm.setId(rs.getString("id"));
uploadForm.setUuid(rs.getString("uuid"));
uploadForm.setGroupid(rs.getString("groupid"));
uploadForm.setRealname(rs.getString("realname"));
uploadForm.setUuidname(rs.getString("uuidname"));
uploadForm.setType(rs.getString("type"));
uploadForm.setPath(rs.getString("path"));
uploadForm.setTtime(rs.getTimestamp("ttime"));
list.add(uploadForm);
}
conn.commit();
} catch (Exception e) {
list = null;
sqloperate.rollbackJdbc(conn);
} finally {
sqloperate.closeJdbc(conn, st, rs, defaultCommit);
}
return list;
}
/**
* 返回下载文件总数
* @param groupid
* @return
*/
public long count(String groupid){
Connection conn = null;
Statement st = null;
ResultSet rs = null;
boolean defaultCommit = false;
SqlOperate sqloperate = new SqlOperate();
int totleCounts = 0;
String sql = "select count(*) as c from EKP_RESOURCESHARING where groupid="+groupid;
try {
conn = sqloperate.connectDatabase("");
defaultCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
st = sqloperate.getStatement(conn);
rs = sqloperate.execQuery(st, sql);
rs.next();
totleCounts = rs.getInt("c");
conn.commit();
} catch (Exception e) {
totleCounts = 0;
sqloperate.rollbackJdbc(conn);
} finally {
sqloperate.closeJdbc(conn, st, rs, defaultCommit);
}
return totleCounts;
}

public UploadForm getUploadById(String fileid){
Connection conn = null;
Statement st = null;
ResultSet rs = null;
boolean defaultCommit = false;
UploadForm uploadForm = new UploadForm();
SqlOperate sqloperate = new SqlOperate();
String sql = "SELECT * FROM EKP_RESOURCESHARING where id="+fileid;

try {
conn = sqloperate.connectDatabase("");
defaultCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
st = sqloperate.getStatement(conn);
rs = sqloperate.execQuery(st, sql);
while(rs.next()){
uploadForm.setId(rs.getString("id"));
uploadForm.setUuid(rs.getString("uuid"));
uploadForm.setGroupid(rs.getString("groupid"));
uploadForm.setRealname(rs.getString("realname"));
uploadForm.setUuidname(rs.getString("uuidname"));
uploadForm.setType(rs.getString("type"));
uploadForm.setPath(rs.getString("path"));
uploadForm.setTtime(rs.getTimestamp("ttime"));
}
conn.commit();
} catch (Exception e) {
uploadForm = null;
sqloperate.rollbackJdbc(conn);
} finally {
sqloperate.closeJdbc(conn, st, rs, defaultCommit);
}
return uploadForm;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值