无法打开通过回复()下载的文件 - > download()

时间:2018-02-14 18:22:57

标签: php laravel

我有一个负责下载文件的方法。

$attachment = KnowledgeDatabaseAttachments::where('id', $id)->first();
if ($attachment) {
    $filesPath = storage_path('app/knowledge_database_attachments');
    return response()->download($filesPath . '/' . $attachment->physical_name);
}

下载后,当我尝试打开它时(这是我操作系统的错误消息):

Could not load image '88ebb9c0-11af-11e8-b056-b1568dc848cb.jpg'.
Error interpreting JPEG image file (Not a JPEG file: starts with 0x0a 0xff)

文件保存如下:

$filesPath = storage_path('app/knowledge_database_attachments');
$physicalName = Uuid::generate() . '.' . $file->getClientOriginalExtension();
$file->move($filesPath, $physicalName);

KnowledgeDatabaseAttachments::create([
    'knowledge_database_id' => $page->id,
    'name' => $file->getClientOriginalName(),
    'physical_name' => $physicalName
]);

该目录中存在文件,下载的文件大小和名称正确。

有趣的部分是我还可以创建一个包含此文件的简报。当我创建简报时复制文件:

$extension = explode('.', $attachment->physical_name)[1];
$newPhysicalName = Uuid::generate() . '.' . $extension;
File::copy($attachment->getPathAttribute(), $storagePath . DIRECTORY_SEPARATOR . $newPhysicalName);

SendMailAttachments::create([
    'mail_id' => $mail->id,
    'filename' => $attachment->name,
    'physical_name' => $newPhysicalName,
]);

然后,在时事通讯编辑视图中,我也可以使用此方法(与上述相同)下载此文件:

$attachment = SendMailAttachments::where('mail_id', $mailId)->where('filename', $attachmentName)->first();
if ($attachment) {
    $filesPath = storage_path('app/sendmail_attachments');
    return response()->download($filesPath . '/' . $attachment->physical_name);
}

它有效 - 文件已正确下载,我可以打开它。

为什么我无法打开使用第一种方法下载的文件?

我使用Laravel 5.1和Ubuntu 16.04(如果重要的话)。

修改

当我在下载的文件上运行file命令时,结果为data。当我在存储文件中运行它时,结果是正确的JPEG image data

2 个答案:

答案 0 :(得分:0)

尝试添加带响应的标头 View docs

$headers = array('Content-Type' => ' image/jpeg');
$filesPath = storage_path('app/knowledge_database_attachments');
return response()->download($filesPath,$attachment->physical_name,$headers);

注意:管理文件下载的Symfony HttpFoundation要求下载的文件具有ASCII文件名。

答案 1 :(得分:0)

问题是我在图像流之前输出了一些内容。

临时解决方案:

$response = response()->download($filesPath . '/' . $attachment->physical_name);
ob_end_clean();
return $response;

永久解决方案: 找出什么是输出并将其删除。

在此处找到:https://laracasts.com/discuss/channels/laravel/image-is-being-thrown-as-a-white-blank-image?page=1