我有一个负责下载文件的方法。
$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
。
答案 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