【问题标题】:How to download PDF from Spring REST service using Postman如何使用 Postman 从 Spring REST 服务下载 PDF
【发布时间】:2019-05-15 00:36:56
【问题描述】:

我有一个基于 Spring 的 Rest 服务,它提供 PDF 作为响应。使用下面的代码,我可以在邮递员中将 PDF 内容作为二进制值获取。我的问题是在调用服务时将其作为附件下载。

要实现这一点,我需要对代码或客户端进行任何更改。

@GetMapping(value="/getUserpdf")
    public ResponseEntity<Resource> getUserInfo(@RequestHeader(name="reqHeader") Map<String, String> reqHeader,
                                                  @RequestParam(name="userId",required=true) String userId){

        MetaInfo metaInfo = getHeaderValues(reqHeader);

        //To get Actual PDF content as Bytes
        byte[] pdfBytes = getUserPdfService.getUserInfo(metaInfo,userId);

        ByteArrayResource resource = new ByteArrayResource(pdfBytes);

        HttpHeaders headers = new HttpHeaders();
        headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
        headers.add("Pragma", "no-cache");
        headers.add("Expires", "0");
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=UserInfo.pdf");



        return ResponseEntity
                      .ok()
                      .headers(headers)
                      .contentLength(pdfBytes.length)
                      .contentType(MediaType.parseMediaType("application/octet-stream")).body(resource);
    }

我也注册了我的转换器

@Bean
    public HttpMessageConverters customConverters() {
        ByteArrayHttpMessageConverter arrayHttpMessageConverter = new ByteArrayHttpMessageConverter();
        return new HttpMessageConverters(arrayHttpMessageConverter);
    }

【问题讨论】:

    标签: spring-boot postman


    【解决方案1】:

    这是一个例子:

    @GetMapping("/getUserpdf/{id}")
        @CrossOrigin
        @ResponseBody
        public ResponseEntity<InputStreamResource> downloadFile(@PathVariable(required = true, value = "id") Long id,@RequestParam(name="userId",required=true) String userId,HttpServletRequest request) throws IOException {
    
            //To get Actual PDF content as Bytes
            byte[] pdfBytes = getUserPdfService.getUserInfo(id,userId);
            if (Objects.nonNull(pdfBytes)) {
                String fileName = "UserInfo.pdf";
                MediaType mediaType = MediaType.parseMediaType("application/pdf");
                File file = new File(fileName);
                FileUtils.writeByteArrayToFile(file, pdfBytes); //org.apache.commons.io.FileUtils
                InputStreamResource resource = new InputStreamResource(new FileInputStream(file));
    
                return ResponseEntity.ok()
                        // Content-Disposition
                        .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + file.getName())
                        // Content-Type
                        .contentType(mediaType)
                        // Contet-Length
                        .contentLength(file.length()) //
                        .body(resource);
            } else {
                throw ResponseEntity.notFound().build();
            }
        }
    

    注意:我对 mediaType 不满意,但您可以确认它是否正常!

    【讨论】:

    • 它可以工作,但这种方法也在我的本地创建文件。我正在寻找类似当用户点击我的 rest api 作为响应时我需要发送 PDF 附件而不将其存储在我的本地
    • 这种方法也在我的本地创建文件!我不清楚!
    • 我已包含 FileOutputStream 以将内容写入在我的本地工作区创建 PDF 的文件。不,我已经更改并使用 ByteArrayResource 它现在可以正常工作了。
    猜你喜欢
    • 2020-01-02
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 2016-04-10
    相关资源
    最近更新 更多