package io.loli.sc.server.action.pan; import io.loli.sc.server.config.FileListConfig; 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.entity.pan.LinkEntity; import io.loli.sc.server.service.pan.FileService; import io.loli.sc.server.service.pan.FolderService; import io.loli.sc.server.service.pan.LinkService; import io.loli.sc.server.util.StorageFolders; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.inject.Inject; import javax.inject.Named; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @RequestMapping(value = "pan/file") @Named public class FileAction { @Inject private StorageFolders storageFolders; @Inject private FolderService fs; @Inject private FileService fis; @Inject private LinkService ls; @RequestMapping("list") public String list(@RequestParam(value = "pid", required = false) Integer pid, HttpServletRequest request, @RequestParam(value = "start", required = false) Integer startIndex, @RequestParam(value = "max", required = false) Integer maxCount, @RequestParam(value = "type", required = false) String type ) { User user = (User) request.getSession().getAttribute("user"); FolderEntity root = fs.findRootByUser(user); boolean begin = false; if (pid == null || pid == 0) { pid = root.getId(); } if (startIndex == null || startIndex == 0) { startIndex = 0; begin = true; } if (type == null) { type = "folder"; } if (maxCount == null) { maxCount = FileListConfig.PAGE_DEFAULT_COUNT; } List<FolderEntity> folders = null; List<FileEntity> files = null; if (type.equals("folder")) { folders = fs.listByUserAndPath(user, pid, startIndex, maxCount); int folderSize = folders.size(); int fileSize = folderSize < maxCount ? maxCount - folderSize : 0; files = fis.listByUserIdAndFolderId(user.getId(), pid, 0, fileSize); } else { folders = new ArrayList<>(); files = fis.listByUserIdAndFolderId(user.getId(), pid, startIndex, maxCount); } request.setAttribute("folderList", folders); request.setAttribute("fileList", files); request.setAttribute("rootFolder", root); request.setAttribute("parentList", fs.findParentsByFolder(pid)); root = fs.findById(pid); request.setAttribute("parent", root); request.setAttribute("begin", begin); return "pan/fileList"; } @RequestMapping("add") public String add(@RequestParam(value = "pid") int parentId, @RequestParam(value = "name") String folderName, HttpServletRequest request) { FolderEntity parent = fs.findById(parentId); FolderEntity fe = new FolderEntity(); fe.setParent(parent); fe.setName(folderName); fe.setFullPath(parent.getFullPath() + folderName + "/"); fe.setCreateDate(new Date()); User user = (User) request.getSession().getAttribute("user"); fe.setUser(user); fs.save(fe); return this.list(parentId, request, 0, FileListConfig.PAGE_DEFAULT_COUNT, "folder"); } @RequestMapping("getPermentLinkByFileId") @ResponseBody public String getPermentLinkByFileId(@RequestParam(value = "fileId") Integer fileId) { FileEntity file = fis.findById(fileId); LinkEntity link = ls.getPermLinkByFileId(file); return "pan/file/dl" + "/" + link.getPath(); } @RequestMapping(value = "dl/{md5}") public void download(@PathVariable(value = "md5") String md5, HttpServletRequest request, HttpServletResponse response, HttpSession session) { FileEntity file = ls.findFileByPath(md5); Object obj = session.getAttribute("user"); if (obj != null && ((User) obj).getId() == file.getUser().getId()) { } else { response.setContentType("text/html"); try { response.getWriter().println("尚未登录或者该文件不属于您"); } catch (IOException e) { } return; } try (InputStream is = new BufferedInputStream(storageFolders.getFile(file.getKey())); OutputStream os = new BufferedOutputStream(response.getOutputStream());) { response.setContentLength(file.getLength().intValue()); response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=" + file.getOriginName()); byte[] buffer = new byte[2048]; for (int length = 0; (length = is.read(buffer)) > 0;) { os.write(buffer, 0, length); } } catch (FileNotFoundException e) { } catch (IOException e1) { } finally { } } @RequestMapping(value = "delete") @ResponseBody public String deleteByIds(@RequestParam("ids") String ids) { List<Integer> toDelete = new ArrayList<Integer>(); for (String s : ids.split(",")) { int i = Integer.parseInt(s); toDelete.add(i); } fis.batchDelete(toDelete); return "success"; } }