package cn.sini.company.module.mongodb.action;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import cn.sini.company.annex.entity.Annex;
import cn.sini.company.annex.entity.Annex.AnnexModule;
import cn.sini.company.common.http.HttpRequestWrapper;
import cn.sini.company.common.http.HttpResponseWrapper;
import cn.sini.company.common.util.CommonUtils;
import cn.sini.company.common.util.Environment;
import cn.sini.company.common.util.JacksonUtils;
import cn.sini.company.module.mongodb.util.Office2PDFUtil;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBObject;
import com.mongodb.gridfs.GridFS;
import com.mongodb.gridfs.GridFSDBFile;
import com.mongodb.gridfs.GridFSInputFile;
@Controller
@RequestMapping("/upload")
public class UploadAction {
@Autowired
private MongoTemplate mongoTemplate;
@RequestMapping("/index")
public String index() {
return "upload/index";
}
/** 下载文件 */
@RequestMapping("/download/{id}")
public void download(HttpResponseWrapper response, @PathVariable("id") String id) {
DB db = mongoTemplate.getDb();
GridFS gridFS = new GridFS(db, "FILE");
GridFSDBFile gridFSDBFile = gridFS.findOne(new ObjectId(id));
response.setHeader("Content-Type", "application/force-download");
response.setHeader("Content-Disposition", "attachment;filename=" + CommonUtils.encode(gridFSDBFile.getFilename()));
response.setHeader("Content-Length", gridFSDBFile.getLength() + "");
response.setHeader("Content-Transfer-Encoding", "binary");
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
try {
IOUtils.copyLarge(gridFSDBFile.getInputStream(), response.getOutputStream());
} catch (Exception e) {
}
}
/** 查看文件 */
@RequestMapping("/view/{id}")
public void view(HttpResponseWrapper response, @PathVariable("id") String id) {
DB db = mongoTemplate.getDb();
GridFS gridFS = new GridFS(db, "FILE");
GridFSDBFile gridFSDBFile = gridFS.findOne(new ObjectId(id));
String fileName = gridFSDBFile.getFilename();
String mimeType = Environment.getServletContext().getMimeType(fileName);
InputStream inputStream = gridFSDBFile.getInputStream();
String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
String length = gridFSDBFile.getLength() + "";
boolean download = false;
try {
if (mimeType != null && mimeType.startsWith("image/")) {
} else if ("xls".equals(suffix) || "doc".equals(suffix) || "ppt".equals(suffix) || "pdf".equals(suffix) || "docx".equals(suffix) || "pptx".equals(suffix) || "xlsx".equals(suffix)) {
if (!"application/pdf".equals(mimeType)) {
mimeType = "application/pdf";
String convertPath = Environment.getProperty("convert.path");
Office2PDFUtil.office2PDF(inputStream, convertPath);
File file = new File(convertPath);
inputStream = new FileInputStream(file);
length = file.length() + "";
}
} else if (mimeType != null && mimeType.startsWith("text/")) {
mimeType = "text/plain";
} else {
mimeType = "application/force-download";
download = true;
}
mimeType += ";charset=GBK";
response.setHeader("Content-Type", mimeType);
response.setHeader("Content-Disposition", (download ? "attachment;" : "") + "filename=" + CommonUtils.encode(fileName));
response.setHeader("Content-Length", length);
response.setHeader("Content-Transfer-Encoding", "binary");
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
IOUtils.copyLarge(inputStream, response.getOutputStream());
} catch (Exception e) {
}
}
/** 合并、验证分片方法 */
@SuppressWarnings("resource")
@RequestMapping(value = "/mergeOrCheckChunks", method = RequestMethod.POST)
public void mergeOrCheckChunks(HttpRequestWrapper request, HttpResponseWrapper response) {
String param = request.getString("param");
String fileName = request.getString("fileName");
String fileMd5 = request.getString("fileMd5");
String savePath = Environment.getProperty("upload.temp.path");
if (param.equals("mergeChunks")) {
// 合并文件
File f = new File(savePath + "/" + fileMd5);
File[] fileArray = f.listFiles(new FileFilter() {
// 排除目录只要文件
@Override
public boolean accept(File pathname) {
if (pathname.isDirectory()) {
return false;
}
return true;
}
});
// 转成集合,便于排序
List<File> fileList = null;
try {
fileList = new ArrayList<File>(Arrays.asList(fileArray));
Collections.sort(fileList, new Comparator<File>() {
@Override
public int compare(File o1, File o2) {
if (Integer.parseInt(o1.getName()) < Integer.parseInt(o2.getName())) {
return -1;
}
return 1;
}
});
} catch (Exception e) {
response.outputJson(false);
}
// 截取文件名的后缀名
int pointIndex = fileName.lastIndexOf(".");
// 后缀名
String suffix = fileName.substring(pointIndex);
// 合并后的文件
File outputFile = new File(savePath + "/" + fileMd5 + suffix);
// 创建文件
try {
outputFile.createNewFile();
// 输出流
FileChannel outChnnel = new FileOutputStream(outputFile).getChannel();
// 合并
FileChannel inChannel;
for (File file : fileList) {
inChannel = new FileInputStream(file).getChannel();
inChannel.transferTo(0, inChannel.size(), outChnnel);
inChannel.close();
}
outChnnel.close();
} catch (Exception e) {
response.outputJson(false);
}
// 清除文件夹
File tempFile = new File(savePath + "/" + fileMd5);
if (tempFile.isDirectory() && tempFile.exists()) {
tempFile.delete();
}
ObjectNode resultMap = JacksonUtils.getObjectNode();
// 将文件的最后上传时间、Md5值、真实名称、生成的文件名称返回
resultMap.put("md5", fileMd5);
resultMap.put("realName", fileName);
resultMap.put("fileName", fileMd5 + suffix);
response.outputJson(true, resultMap);
} else if (param.equals("checkChunk")) {
/************************* 检查当前分块是否上传成功 **********************************/
String chunk = request.getString("chunk");
String chunkSize = request.getString("chunkSize");
// 将系统当前时间转换为字符串
File checkFile = new File(savePath + "/" + fileMd5 + "/" + chunk);
response.setContentType("text/html;charset=utf-8");
// 检查文件是否存在,且大小是否一致
if (checkFile.exists() && checkFile.length() == Integer.parseInt(chunkSize)) {
// 上传过
response.outputJson(true);
} else {
response.outputJson(false);
}
}