在Spring中的请求之间存储(可能很大)文件

时间:2013-12-18 16:20:42

标签: spring session spring-mvc request

我有这种控制器方法,根据用户引入的参数下载某个PDF文件,并显示一个视图,其不同的页面转换为PNG。

所以我接近它的方式是这样的:

首先,我映射一个方法来接收用户发送的帖子数据,然后生成实际PDF转换器的URL并将其传递给模型:

@RequestMapping(method = RequestMethod.POST)
    public String formPost(Model model, HttpServletRequest request) {
      //Gather parameters and generate PDF url
      Long idPdf = Long.parseLong(request.getParam("idPdf"));
      //feed the jsp the url of the to-be-generated image
      model.addAttribute("image", "getImage?idPdf=" + idPdf);
}

然后在getImageMethod中我下载PDF,然后从中生成PNG:

@RequestMapping("/getImage")
    public HttpEntity<byte[]> getPdfToImage(@RequestParam Long idPdf) {
      String url = "myPDFrepository?idPDF=" + idPdf;
      URL urlUrl = new URL(url);
            URLConnection urlConnection;
            urlConnection = urlUrl.openConnection();
            InputStream is = urlConnection.getInputStream();
       return PDFtoPNGConverter.convert(is);
}

我的JSP只有一个引用此url的img标记:

<img src="${image}" />

到目前为止,这项工作完美无缺。但现在我需要允许查看多页PDF的可能性,转换为PNGS,每个都在不同的页面中。所以我会添加一个page参数,然后使用包含该页面参数的图片网址提供我的模型,在我的getImage方法中我只会转换该页面。

但是实现的方式,我会再次为每个页面下载PDF,再加上视图的额外时间,这样就可以看出这个特定的PDF是否有更多的页面,然后显示“prev”和“下一个“按钮。

在这些请求期间保留同一文件的好方法是什么,所以我只下载一次?我想过使用临时文件但是管理它的删除可能是个问题。那么将PDF存储在会话中可能是一个很好的解决方案吗?我甚至都不知道这是不是好习惯。

我顺便使用Spring MVC。

1 个答案:

答案 0 :(得分:2)

我认为最简单的方法是使用spring cache abstraction。查看tutorial并需要稍微更改一下代码:将加载pdf的逻辑移到单独的类中。

它看起来像:

interface PDFRepository {
     byte[] getImage(long id);
}

@Repository
public class PDFRepositoryImpl implements PDFRepository {
    @Cacheable
    public byte[] getImage(long id) {
        String url = "myPDFrepository?idPDF=" + idPdf;
        URL urlUrl = new URL(url);
        URLConnection urlConnection;
        urlConnection = urlUrl.openConnection();
        InputStream is = urlConnection.getInputStream();
        return PDFtoPNGConverter.convert(is);
    }
}

您将获得可插入缓存实施支持和良好的缓存过期管理。