package io.loli.sc.server.action.pan;
import io.loli.aliyun.oss.StorageFile;
import io.loli.sc.server.entity.User;
import io.loli.sc.server.entity.pan.FileEntity;
import io.loli.sc.server.entity.pan.FolderEntity;
import io.loli.sc.server.service.pan.FileService;
import io.loli.sc.server.service.pan.FolderService;
import io.loli.sc.server.util.Md5Utils;
import io.loli.sc.server.util.StorageFolders;
import io.loli.util.string.MD5Util;
import java.io.File;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.Date;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.http.HttpSession;
import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
@Named
@RequestMapping(value = "pan/file/upload")
public class FileUploadAction {
@Inject
private StorageFolders storageFolders;
@Inject
private FolderService sfs;
@Inject
private FileService fs;
@Inject
private Md5Utils md5Utils;
private final static Logger logger = Logger.getLogger(FileUploadAction.class);
@RequestMapping(value = "", method = { RequestMethod.PUT, RequestMethod.POST })
@ResponseBody
public FileEntity upload(@RequestParam int folderId,
@RequestParam(value = "file", required = true) MultipartFile file, HttpSession session) throws IOException {
User user = (User) session.getAttribute("user");
String originName = file.getOriginalFilename();
long now = System.nanoTime();
String email = user.getEmail();
String strToHash = originName + now + email;
String generatedName = null;
try {
generatedName = MD5Util.hash(strToHash);
} catch (NoSuchAlgorithmException e) {
logger.error(e);
e.printStackTrace();
}
File f = this.saveFile(file, generatedName);
StorageFile uploadedFile = storageFolders.uploadFile(f);
FolderEntity parent = sfs.findById(folderId);
FileEntity entity = new FileEntity();
entity.setUser(user);
entity.setLength(file.getSize());
entity.setCreateDate(new Date());
entity.setFolder(parent);
entity.setKey(uploadedFile.getObject().getKey());
entity.setNewName(originName);
entity.setOriginName(originName);
fs.save(entity);
md5Utils.addTask(f, entity.getId());
return entity;
}
private File saveFile(MultipartFile mfile, String name) {
File file = new File(System.getProperty("java.io.tmpdir"), name);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdir();
}
try {
FileUtils.writeByteArrayToFile(file, mfile.getBytes());
} catch (IOException e) {
logger.error(e);
}
return file;
}
}