reactjs 使用JavaScript和React JS从API下载PDF时,PDF为空白且已损坏

plupiseo  于 2022-11-04  发布在  React
关注(0)|答案(2)|浏览(271)

我正在从API下载一个PDF文件,但得到的是一个空白的PDF。我已经测试了API端点,并能够在控制台上获得字节流,当我将其保存到文件时,它被保存,文件看起来很好。使用React将相同的响应返回到前端,我可以在响应中看到PDF字节流。但是,我看不到内容。当我从我的本地打开下载的PDF时,它说文件是damaged or corrupted。我已经看了很多例子,并遵循相同的模式,但我认为我在这里遗漏了一些东西。
我的API Java端点定义如下所示

@GetMapping(value = "/fetchFile")   
    public ResponseEntity<byte[]> fetchFile(@RequestParam final String key) {
        FileResponse response = myService.readFile(key);
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.add(HttpHeaders.CONTENT_DISPOSITION,
                "attachment; filename=\"" + key.substring(key.lastIndexOf('/') + 1) + "\"");
        return Mono.just(ResponseEntity.ok().headers(httpHeaders).contentLength(response.getContentLength())
                .contentType(MediaType.parseMediaType(response.getContentType()))
                .body(response.getResponseBytes()));
    }

前端:

rounterFetchFile.js

router.get('/', (request, resp) => {
  axios({
    method: 'get',
    baseURL: 'http://mybackend.apibase.url',
    responseType: 'blob',
    url: '/fetchFile',
    params: {
      fileKey: 'myfile.pdf'
    }    
  })
    .then(response => {      
      return resp.send(response.data)
    })
    .catch(error => {
      console.error(error)
      return resp.status(error.response.status).end()
    })
})

myFileComoponent.js为单位
//一个从rounterFetchFile.js读取响应的函数

const getDocumentOnClick = async () => {

        try {
            var {data} = await pullMyPDF()
            var blob = new Blob([data], { type: "application/pdf" });
            var link = document.createElement('a');
            link.href = window.URL.createObjectURL(blob);
            link.download = "myFileName.pdf";
            link.click();                     
        } catch (e) {
            console.log(e)
        }
    }

给你

var {data} = await pullMyPDF()

正在返回以下内容,我对比了一下 Postman 返回的结果,结果是一样的,react也显示生成的文件大小不为空,我找不到哪里错了x1c 0d1x
以下是API端点对fetchFile

的响应

bis0qfac

bis0qfac1#

我有一个类似的问题,我修复了它:

  • 温泉
axios.post(
          'api-url',
          formData,
          {
            responseType: 'blob',
            headers: {
                'Accept': 'application/pdf'
          }
         })
         .then( response => {
              const url = URL.createObjectURL(response.data);
              this.setState({
                  filePath: url,
                  fileType: 'pdf',
              })
          })
         .catch(function (error) {
              console.log(error);
         });
  • 美国石油学会
[HttpPost]
 public async Task<IActionResult> Post()
 {
     var request = HttpContext.Request;

     var pdfByteArray = await convertToPdfService.ConvertWordStreamToPdfByteArray(request.Form.Files[0], "application/msword");

     return File(pdfByteArray, "application/pdf");
 }

当响应类型是blob并且在头中接受“application / pdf”时,使用该配置完成工作;)......

hsgswve4

hsgswve42#

对我有用的是从控制器发送base64字节。
美国石油学会:

public async Task<ActionResult> GetAsync() {
    var documentBytes = await GetDocumentAsync().ConfigureAwait(false);
    return Ok(Convert.ToBase64String(documentBytes))
}

前端:

client.get(url, {
    headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json'
    }
})
    .then(response => {
        const link = document.createElement('a');
        link.href = "data:application/octet-stream;base64," + response.data;
        link.download = 'file.pdf';
        link.click();
    })
    .catch(error => {
        console.log(error);
    })

我希望这能解决你的问题。

相关问题