/*** fileInput*/
packagecom.servlet;importjava.io.File;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.PrintWriter;importjava.sql.DriverManager;importjava.text.SimpleDateFormat;importjava.util.ArrayList;importjava.util.Date;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.Properties;importjava.util.UUID;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.apache.commons.fileupload.FileItem;importorg.apache.commons.fileupload.disk.DiskFileItemFactory;importorg.apache.commons.fileupload.servlet.ServletFileUpload;importorg.apache.commons.io.FileUtils;importcom.mysql.jdbc.Connection;importcom.mysql.jdbc.PreparedStatement;importcom.mysql.jdbc.ResultSet;importnet.sf.json.JSONArray;/***
*@author典型的码农
*@version$Id: FileUploadServlet.java, v 0.1 2017年7月20日 上午10:50:06*/
public class FileUploadServlet extendsHttpServlet {private static final long serialVersionUID = -1654876187842392874L;public FileUploadServlet() { super(); }public void destroy() { super.destroy(); }public void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException { }private Properties pro= newProperties();/*** 初始化时 获取核心配置文件
**/
public void init() throwsServletException {
pro=getUpConfig();
}/*** post 请求
**/
public voiddoPost(HttpServletRequest request, HttpServletResponse response) {
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");if("upload".equals( request.getParameter("cmd"))){
upload(request,response);
}else if("delete".equals( request.getParameter("cmd"))){
delete(request,response);
}else if("initFileInput".equals(request.getParameter("cmd"))){
queryFileByPid(request,response);
}
}/*** 上传
* 注:fileinput 上传每次只上传一个文件 批量上传时会多次请求
**/
private voidupload(HttpServletRequest request, HttpServletResponse response){try{//文件父ID(分类ID,业务ID)
String bizid = request.getParameter("bizid");//配置上传参数
DiskFileItemFactory factory = newDiskFileItemFactory();//设置内存临界值 - 超过后将产生临时文件并存储于临时目录中
factory.setSizeThreshold(Integer.parseInt(pro.getProperty("memory.threshold")));//设置临时存储目录
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
ServletFileUpload upload= newServletFileUpload(factory);//设置最大文件上传值
upload.setFileSizeMax(Integer.parseInt(pro.getProperty("file.maxSize")));//中文处理
upload.setHeaderEncoding("UTF-8");
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");//构建文件保存目录
String uploadPath = pro.getProperty("file.uploadDir")+"/"+ sdf.format(newDate());//如果目录不存在则创建
File uploadDir = newFile(uploadPath);if (!uploadDir.exists()) {
uploadDir.mkdir();
}//解析请求的内容提取文件数据
@SuppressWarnings("unchecked")
List formItems =upload.parseRequest(request);
String id= "";if (formItems != null && formItems.size() > 0) {//迭代表单数据
for(FileItem item : formItems) {//处理不在表单中的字段
if (!item.isFormField()) {
String fileName= newFile(item.getName()).getName();//上传
FileUtils.copyInputStreamToFile(item.getInputStream(),newFile(uploadPath,fileName));//上传后保存
id = saveFileInfo(uploadPath+"/"+fileName,fileName,item.getSize()+"",bizid);
}
}
}
ajax(response,id);
}catch(Exception e) {
e.printStackTrace();
}
}/*** 删除文件数据
* **/
private voiddelete(HttpServletRequest request, HttpServletResponse response){try{
String id= request.getParameter("id");//删除文件
deleteFile(id);
String sql= "delete from "+pro.getProperty("table")+" where "+pro.getProperty("field.id")+"='"+id+"'";
Connection conn=getConn();
PreparedStatement pstmt;
pstmt=(PreparedStatement) conn.prepareStatement(sql);
pstmt.executeUpdate();
pstmt.close();
conn.close();
}catch(Exception e) {
e.printStackTrace();
}
}/*** 删除文件
**/
private void deleteFile(String id) throwsException {
String sql= "select * from "+pro.getProperty("table")+" where "+pro.getProperty("field.id")+"='"+id+"'";
Connection conn=getConn();
PreparedStatement pstmt;
pstmt=(PreparedStatement) conn.prepareStatement(sql);//注意:此resulSet 来之mysql连接驱动包 跟换驱动时需注意
ResultSet rs =(ResultSet) pstmt.executeQuery();while(rs.next()){
String filePath= rs.getString("F_PATH");
File file= newFile(filePath);
file.delete();
}
rs.close();
pstmt.close();
conn.close();
}/*** 上传后保存信息入库
* 注:根据实际入参需求 重新此方法
*@paramfilePath ,fileName ,fileSize
*@throwsException
*@returnuuid
**/
private String saveFileInfo(String filePath,String fileName,String fileSize,String bizid) throwsException{
UUID uuid=UUID.randomUUID();
String sql= "insert into "+pro.getProperty("table")+"("+pro.getProperty("field.id")+","+pro.getProperty("field.path")+","+pro.getProperty("field.fileName")+","+pro.getProperty("field.size")+","+pro.getProperty("field.bizid")+") values('"+uuid+"','"+filePath+"','"+fileName+"','"+fileSize+"','"+bizid+"')";
Connection conn=getConn();
PreparedStatement pstmt;
pstmt=(PreparedStatement) conn.prepareStatement(sql);
pstmt.executeUpdate();
pstmt.close();
conn.close();returnuuid.toString();
}/*** 根据父ID查询文件
**/
private voidqueryFileByPid(HttpServletRequest request, HttpServletResponse response){try{
String bizid= request.getParameter("bizid");
String sql= "select * from "+pro.getProperty("table")+" where "+pro.getProperty("field.bizid")+"='"+bizid+"'";
Connection conn=getConn();
PreparedStatement pstmt;
pstmt=(PreparedStatement) conn.prepareStatement(sql);//注意:此resulSet 来之mysql连接驱动包 跟换驱动时需注意
ResultSet rs =(ResultSet) pstmt.executeQuery();
List> resultList = new ArrayList>();while(rs.next()){
Map map = new HashMap();
map.put("id", rs.getString(pro.getProperty("field.id")));
map.put("path", rs.getString(pro.getProperty("field.path")));
map.put("name", rs.getString(pro.getProperty("field.fileName")));
map.put("size", rs.getString(pro.getProperty("field.size")));
resultList.add(map);
}
rs.close();
pstmt.close();
conn.close();
ajax(response,resultList);
}catch(Exception e) {
e.printStackTrace();
}
}/*** 获取上传附件配置:上传地址、文件大小、数据库配置
*@returnProperties
*
**/
privateProperties getUpConfig() {
Properties prop= newProperties();try{//返回Servlet上下文路径。
String path = this.getServletContext().getRealPath("/");//在Servlet上下文路径的最后包含一个"."号,所以这里将它去除。
path = path.substring(0, path.length() - 1);//我将路径放置在项目下的WEB-INF目录下。
path = path + "\\WEB-INF\\";//这里就是我的properties文件。
path = path + "fileUploadConfig.properties";
FileInputStream input= newFileInputStream(path);
prop.load(input);
}catch(Exception e) {
e.printStackTrace();
}returnprop;
}/**获取jdbc连接*/
private Connection getConn() throwsException {
String driver= pro.getProperty("db.driver");
String url= pro.getProperty("db.url");
String username= pro.getProperty("db.username");
String password= pro.getProperty("db.password");
Connection conn= null;
Class.forName(driver);//classLoader,加载对应驱动
conn =(Connection) DriverManager.getConnection(url, username, password);returnconn;
}/**ajax 返回 注意上传必须返回一个json*/
public voidajax(HttpServletResponse response,String id){try{
response.setContentType("application/json");
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setCharacterEncoding("UTF-8");
PrintWriter out= null;
out=response.getWriter();
Map map = new HashMap();
map.put("id", id);
JSONArray json=JSONArray.fromObject(map);
out.print(json);
out.flush();
out.close();
}catch(IOException e) {
e.printStackTrace();
}
}/**ajax 返回 注意上传必须返回一个json*/
public void ajax(HttpServletResponse response,List>resultList){try{
response.setContentType("application/json");
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setCharacterEncoding("UTF-8");
PrintWriter out= null;
out=response.getWriter();
JSONArray json=JSONArray.fromObject(resultList);
out.print(json);
out.flush();
out.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}