0

我在 Laravel 中创建了控制器,其中包含以下代码

$doc = Document::find($id);
if (Storage::disk('local')->exists($doc->path)) {
      return Storage::disk('local')->get($doc->path);
}

在我的前端,我使用 javascript 以编程方式下载带有以下代码的文件(可以使用 blob 还是有任何其他方法可以做到这一点?)

async downloadDocument() {   
  DocService.downloadDoc(this.document.id).then((response) => {  // Service that handles ajax call
    const url = window.URL.createObjectURL(new Blob([response.data]));
    const link = document.createElement("a");
    link.href = url;
    link.setAttribute("download", this.document.name);
    document.body.appendChild(link);
    link.click();
    link.remove();
  });
},

我可以下载并查看 txt、php 文件的内容,但是当我尝试下载图像、pdf 等文件时,文件内容为空或不可读。

4

2 回答 2

0

请改用download()带有正确标题的方法:

return Storage::download($doc->path, basename($doc->path), [
    'Content-Description' => 'File Transfer',
    'Content-Type' => mime_content_type($doc->path),
]);

如果您想将文件作为原始文本发送给客户端并让它决定如何处理它:

return response(Storage::disk('local')->get($doc->path))->withHeaders([
    'Content-Description' => 'File Transfer',
    'Content-Type' => mime_content_type($doc->path),
]);
于 2021-06-15T09:06:58.563 回答
0

如果有人遇到类似问题,您可以执行以下操作来解决它

Laravel/后端代码:

$path = storage_path() . '/app/' . $doc->path;
        return response()->download($path);

定义文件的路径并使用 download() 响应

前端代码:

async downloadDocument() {
  axios({
    url: "/api/documents/" + this.document.id,
    method: "GET",
    responseType: "blob", // important
  }).then((response) => {
    // Service that handles ajax call
    const url = window.URL.createObjectURL(new Blob([response.data]));
    const link = document.createElement("a");
    link.href = url;
    link.setAttribute("download", this.document.name);
    document.body.appendChild(link);
    link.click();
    link.remove();
  });
},

},

请记住 responseType 很重要,否则您下载的文件(pdf、图像)将不会显示任何内容。

希望这个答案可以帮助某人。

于 2021-08-18T12:59:33.510 回答