Spring Boot商店上传文件

时间:2017-04-15 04:35:32

标签: java caching spring-boot

我需要在用户上传图像后将图像存储几分钟以显示预览,在确认之前,确认后我需要将其恢复并保留。

我想知道最好的做法。

我看到了Cache和Caffeine,但我不知道这是否是最好的实践,以及如何使用随机哈希在Cache中存储以便在

之后将其恢复

[编辑]

也许我高估了这个问题

根据@Robert建议我将使用临时文件,但我仍然需要一些方法来保证文件将被删除。所以我创建了一个新问题,我将继续帮助那些使用这些术语进行搜索的人。

点击链接

How guarantee the file will be deleted after automatically some time?

1 个答案:

答案 0 :(得分:0)

我在其中一个应用中执行此操作。

  • 在上传POST中,我将图像保存到临时文件,然后将临时文件名存储在会话属性中。我使用session属性,因为在将预览图像写入持久存储之前,任何其他用户都不应该看到它。
  • 在随后的GET中,我将临时文件名拉出会话并将其流式传输到响应中,并在完成后将其删除。在呈现预览后我不打算保留文件,因为我不再需要它了。

请参阅以下完整实施:

import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
@RequestMapping("/api/imagePreview")
public class ImagePreviewController
{
    @PostMapping
    public ResponseEntity<?> post(HttpSession session, @RequestPart MultipartFile file) throws IOException
    {
        if (file.getContentType() != null && file.getContentType().startsWith("image/")) {
            Path tempFile = Files.createTempFile("", file.getOriginalFilename());
            file.transferTo(tempFile.toFile());
            session.setAttribute("previewImage", tempFile.toFile().getPath());
            session.setAttribute("previewImageContentType", file.getContentType());
            return ResponseEntity.status(HttpStatus.CREATED).build();
        } else {
            return ResponseEntity.status(HttpStatus.UNSUPPORTED_MEDIA_TYPE).build();
        }
    }

    @GetMapping
    public void get(HttpServletRequest request, HttpServletResponse response) throws IOException
    {
        HttpSession session = request.getSession(false);
        if (session == null) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        }
        String path = (String) session.getAttribute("previewImage");
        String contentType = (String) session.getAttribute("previewImageContentType");
        if (path == null || contentType == null) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        }
        response.setContentType(contentType);
        try (OutputStream out = response.getOutputStream()) {
            Files.copy(Paths.get(path), out);
        } finally {
            Files.deleteIfExists(Paths.get(path));
        }
    }
}