packagecom.ccidit.features.task.util;importit.sauronsoftware.jave.AudioAttributes;importit.sauronsoftware.jave.Encoder;importit.sauronsoftware.jave.EncoderException;importit.sauronsoftware.jave.EncodingAttributes;importit.sauronsoftware.jave.InputFormatException;importjava.io.File;importjava.io.IOException;importjava.io.InputStream;importjava.io.PrintWriter;importjava.sql.Connection;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;importjava.text.DateFormat;importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.Iterator;importjava.util.List;importjava.util.UUID;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importnet.sf.json.JSONArray;importnet.sf.json.JSONObject;importorg.apache.commons.fileupload.FileItem;importorg.apache.commons.fileupload.FileUploadBase;importorg.apache.commons.fileupload.disk.DiskFileItemFactory;importorg.apache.commons.fileupload.servlet.ServletFileUpload;importorg.jaudiotagger.audio.AudioFileIO;importorg.jaudiotagger.audio.mp3.MP3AudioHeader;importorg.jaudiotagger.audio.mp3.MP3File;importcom.ccidit.core.common.jdbc.dao.util.JDBCTools;/*** Servlet implementation class FileDemo*/@WebServlet("/FileDemo")public class upload extendsHttpServlet {/****/
private static final long serialVersionUID = 564190060577130813L;public voiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {
String taskId="";//request.getParameter("taskId");
String replyId ="";//request.getParameter("replyId");//回复楼层的id
Integer userid = 0;//Integer.parseInt(request.getParameter("userid"));
String username ="";//request.getParameter("name");
Integer sourceType =0;//Integer.parseInt(request.getParameter("sourceType"));//附件来源类型(1、直属某一任务2、属于任务下某条回复的附件)//得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
String savePath = "D:/MyInstall/myeclipse2013/tomcat7.0.67/webapps/ueditor/taskAnnex";//String savePath = "C:/tomcat7.0.67/webapps/ueditor/taskAnnex";//250//String path="/home/attachFiles/userpic";//线上//上传时生成的临时文件保存目录
String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");
File tmpFile= newFile(tempPath);if (!tmpFile.exists()) {//创建临时目录
tmpFile.mkdir();
}
File tmpFile1= newFile(savePath);if (!tmpFile1.exists()) {//文件保存路径
tmpFile1.mkdir();
}//消息提示
String message = "";try{//使用Apache文件上传组件处理文件上传步骤://1、创建一个DiskFileItemFactory工厂
DiskFileItemFactory factory = newDiskFileItemFactory();//设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。
factory.setSizeThreshold(1024*100);//设置缓冲区的大小为100KB,如果不指定,那么缓冲区的大小默认是10KB//设置上传时生成的临时文件的保存目录
factory.setRepository(tmpFile);//2、创建一个文件上传解析器
ServletFileUpload upload = newServletFileUpload(factory);//解决上传文件名的中文乱码
upload.setHeaderEncoding("UTF-8");//3、判断提交上来的数据是否是上传表单的数据
if(!ServletFileUpload.isMultipartContent(request)){//按照传统方式获取数据
return;
}//设置上传单个文件的大小的最大值,字节
upload.setFileSizeMax(200*1024*1024);//设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和
upload.setSizeMax(1024*1024*200);//4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List集合,每一个FileItem对应一个Form表单的输入项
List list =upload.parseRequest(request);
Iterator i =list.iterator();
FileItem item;if(request.getParameter("taskId") != null){
taskId= request.getParameter("taskId");
replyId= request.getParameter("replyId");//回复楼层的id
userid = Integer.parseInt(request.getParameter("userid"));
username= request.getParameter("name");
sourceType= Integer.parseInt(request.getParameter("sourceType"));//附件来源类型(1、直属某一任务2、属于任务下某条回复的附件)
}while(i.hasNext()) {
item=(FileItem) i.next();//如果fileitem中封装的是普通输入项的数据
if(item.isFormField()){
String name=item.getFieldName();//解决普通输入项的数据的中文乱码问题
String value = item.getString("UTF-8");if(name.equals("taskId")){
taskId=value;
}if(name.equals("replyId")){
replyId=value;
}if(name.equals("name")){
username=value;
}if(name.equals("userid")){
userid=Integer.parseInt(value);
}if(name.equals("sourceType")){
sourceType=Integer.parseInt(value);
}//System.out.println(name + "=" + value);
}else{//如果fileitem中封装的是上传文件//得到上传的文件名称,
String filename =item.getName();//System.out.println(filename);
if(filename==null || filename.trim().equals("")){continue;
}//注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt//处理获取到的上传文件的文件名的路径部分,只保留文件名部分
filename = filename.substring(filename.lastIndexOf("\\")+1);//得到上传文件的扩展名
String fileExtName = filename.substring(filename.lastIndexOf(".")+1);//如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法//System.out.println("上传的文件的扩展名是:"+fileExtName);//获取item中的上传文件的输入流
InputStream in =item.getInputStream();//得到文件保存的名称
String saveFilename =makeFileName(filename);//得到文件的保存目录
String realSavePath = savePath;//makePath(saveFilename, savePath);//System.out.println(realSavePath);
int size = (int) item.getSize();//创建一个文件输出流
/*FileOutputStream out = new FileOutputStream(realSavePath + "\\" + saveFilename);
//创建一个缓冲区
byte buffer[] = new byte[1024];
//判断输入流中的数据是否已经读完的标识
int len = 0;
//循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
while((len=in.read(buffer))>0){
//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中
out.write(buffer, 0, len);
}
//关闭输入流
in.close();
//关闭输出流
out.close();*/
//删除处理文件上传时生成的临时文件//存储文件
File file = newFile(realSavePath);
String uploadPath=file.getPath();
File savedFile= newFile(realSavePath,saveFilename);
item.write(savedFile);
item.delete();if(fileExtName.equals("amr") || fileExtName.equals("mp3")){//音频文件转换
String[] a = saveFilename.split("\\.");
String fileType= a[a.length-1];if(fileExtName.equals("amr")){
changeToMp3(realSavePath+"/"+saveFilename,realSavePath+"/"+saveFilename.replace(".amr", ".mp3"));//获取语音时间长度
File source = new File(realSavePath+"/"+saveFilename.replace(".amr", ".mp3"));
MP3File f=(MP3File)AudioFileIO.read(source);
MP3AudioHeader audioHeader=(MP3AudioHeader)f.getAudioHeader();this.addRwAnnex(taskId, "/ueditor/taskAnnex"+"/"+saveFilename.replace(".amr", ".mp3"), filename, audioHeader.getTrackLength(), "mp3", replyId, sourceType,userid,username,saveFilename.replace(".amr", ".mp3"));
}else{//获取语音时间长度
File source = new File(realSavePath+"/"+saveFilename);
MP3File f=(MP3File)AudioFileIO.read(source);
MP3AudioHeader audioHeader=(MP3AudioHeader)f.getAudioHeader();this.addRwAnnex(taskId, "/ueditor/taskAnnex"+"/"+saveFilename, filename, audioHeader.getTrackLength(), fileExtName, replyId, sourceType,userid,username,saveFilename);
}
}else{this.addRwAnnex(taskId, "/ueditor/taskAnnex"+"/"+saveFilename, filename, size, fileExtName, replyId, sourceType,userid,username,saveFilename);
}
message= "文件上传成功!";
}
}
}catch(FileUploadBase.FileSizeLimitExceededException e) {
e.printStackTrace();
request.setAttribute("message", "单个文件超出最大值!!!");return;
}catch(FileUploadBase.SizeLimitExceededException e) {
e.printStackTrace();
request.setAttribute("message", "上传文件的总的大小超出限制的最大值!!!");return;
}catch(Exception e) {
message= "文件上传失败!";
e.printStackTrace();
}
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
JSONArray JSONStringlist= getAnnexList(taskId,replyId,sourceType);//获取附件列表
JSONObject obj= newJSONObject();
obj.put("message", "success");
obj.put("list", JSONStringlist);
PrintWriter out1= null;try{
out1=response.getWriter();
out1.write(obj.toString());
}catch(IOException e) {
e.printStackTrace();
}finally{if (out1 != null) {
out1.close();
}
}
}/*** amr 转mp3
*@paramsourcePath
*@paramtargetPath*/
public static voidchangeToMp3(String sourcePath, String targetPath) {
File source= newFile(sourcePath);
File target= newFile(targetPath);
AudioAttributes audio= newAudioAttributes();
Encoder encoder= newEncoder();
audio.setCodec("libmp3lame");
EncodingAttributes attrs= newEncodingAttributes();
attrs.setFormat("mp3");
attrs.setAudioAttributes(audio);try{
encoder.encode(source, target, attrs);
}catch(IllegalArgumentException e) {
e.printStackTrace();
}catch(InputFormatException e) {
e.printStackTrace();
}catch(EncoderException e) {
e.printStackTrace();
}
}/*** @Method: makeFileName
* @Description: 生成上传文件的文件名*/
privateString makeFileName(String filename){//为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名
Date currentDate2= newDate();
SimpleDateFormat df2= new SimpleDateFormat("yyyyMM");
SimpleDateFormat df3= new SimpleDateFormat("yyyyMMDDHHMMSS");
String str2=df2.format(currentDate2);
String str3=df3.format(currentDate2);
String[] a= filename.split("\\.");
String fileType= a[a.length-1];
String saveFileName=filename.replace("."+fileType, "")+ str3+"."+fileType;//保存的文件名
returnsaveFileName;//return UUID.randomUUID().toString() + "_" + filename;
}/*** 为防止一个目录下面出现太多文件,要使用hash算法打散存储
* @Method: makePath
* @Description:
* @Anthor:
*
*@paramfilename 文件名,要根据文件名生成存储目录
*@paramsavePath 文件存储路径
*@return新的存储目录*/
privateString makePath(String filename,String savePath){//得到文件名的hashCode的值,得到的就是filename这个字符串对象在内存中的地址
int hashcode =filename.hashCode();int dir1 = hashcode&0xf; //0--15
int dir2 = (hashcode&0xf0)>>4; //0-15//构造新的保存目录
String dir = savePath + "\\" + dir1 + "\\" + dir2; //upload\2\3 upload\3\5//File既可以代表文件也可以代表目录
File file = newFile(dir);//如果目录不存在
if(!file.exists()){//创建目录
file.mkdirs();
}returndir;
}public voiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {
doGet(request, response);
}/*** 添加任务附件记录*/
public void addRwAnnex(String taskId,String fileDownloadUrl,String fileName,doublefileSize,String fileType,String replyId,Integer sourceType,Integer userid,String name,String saveFileName){
String uid=UUID.randomUUID().toString();
String id= uid.replaceAll("-","");
Date date=newDate();
DateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm");
String time=format.format(date);
String sql= "insert into rw_annex values('"+id+"','"+taskId+"','"+time+"',"+fileSize+",'"+fileType+"','"+fileName+"',"+userid+",'"+name+"','"+fileDownloadUrl+"','"+replyId+"','"+sourceType+"','"+saveFileName+"')";
Statement stmt= null;
ResultSet rs= null;
Connection conn=JDBCTools.getConnection();try{
stmt=conn.createStatement();int a =stmt.executeUpdate(sql);
}catch(SQLException e) {//TODO Auto-generated catch block
e.printStackTrace();
}finally{
JDBCTools.commit(conn);
JDBCTools.release(conn, stmt, rs);
}
}/*** 获取附件记录*/
publicJSONArray getAnnexList(String taskId,String replyId,Integer sourceType){
String list="";
String sql= "select * from rw_annex where taskId = '"+taskId+"' and replyId = '"+replyId+"' and sourceType = '"+sourceType+"'order by uploadTime desc";
Statement stmt= null;
ResultSet rs= null;
Connection conn=JDBCTools.getConnection();
JSONArray array= newJSONArray();try{
stmt=conn.createStatement();
rs=stmt.executeQuery(sql);while(rs.next()){
JSONObject obj= newJSONObject();
obj.put("annexId", rs.getString("annexId"));
obj.put("taskId", rs.getString("taskId"));
obj.put("uploadTime", rs.getString("uploadTime"));
obj.put("fileSize", rs.getString("fileSize"));
obj.put("fileType", rs.getString("fileType"));
obj.put("fileName", rs.getString("fileName"));
obj.put("uploadPeopleId", rs.getString("uploadPeopleId"));
obj.put("uploadPeopleName", rs.getString("uploadPeopleName"));
obj.put("fileDownloadUrl", rs.getString("fileDownloadUrl"));
obj.put("replyId", rs.getString("replyId"));
obj.put("sourceType", rs.getString("sourceType"));
obj.put("saveFileName", rs.getString("saveFileName"));
array.put(obj);
}//list = array;
}catch(SQLException e) {//TODO Auto-generated catch block
e.printStackTrace();
}finally{
JDBCTools.commit(conn);
JDBCTools.release(conn, stmt, rs);
}returnarray;
}
}