Laravel响应::download()以显示Laravel中的图像


Laravel Response::download() to show images in Laravel

所以我找到了在laravel 5中存储和显示图像的两种可能性。第一种方式:为了显示图像,我有一条路线(例如loadFile/profil/{profilID}/main),它返回:

return Response::download($filepath)

我的图像存储在存储文件夹中,因此我无法通过url访问它们,因为这:www.domain.com/sotrage/files/...显然不起作用。

另一种可能性是将图像存储在公共文件夹中,并通过它们的url访问它们。

我的问题是:我应该使用这两种可能性中的哪一种,以及在Laravel中存储图像的最佳实践是什么。

图像上传

$path = public_path('uploads/image/')
$file_name = time() . "_" . Input::file('image')->getClientOriginalName();
Input::file('image')->move($path, $file_name);

下载图像

$filepath = public_path('uploads/image/')."abc.jpg";
return Response::download($filepath);

Jay的解决方案使用public_path(),这使您的代码超出了框架的保证范围。如果你选择他的解决方案,请确保你这样做是有意的。

通过在存储上使用File::,或使用is_file()readfile()public_path()等底层php基元,当您从本地存储切换到外部解决方案时,您的代码现在将中断。首先,使用Flysystem的目的是将代码从中抽象出来,并允许在本地存储、amazons3、sftp或其他类型之间轻松切换。

因此,如果到目前为止您一直在使用Storage类,那么您应该尽可能将自己绑定到它。您的特定问题有一个非常好的解决方法,只使用存储::方法

正确的方法

Storage::download()允许您将HTTP头插入到响应中。默认情况下,它包括一个狡猾的"内容处置:附件",这就是为什么你的浏览器不";显示";图片,并提示您。

您希望将其转换为"内容处置:内联"。

以下是如何覆盖它:

// Overwrite the annoying header
$headers = array(
    'Content-Disposition' => 'inline',
);
return Storage::download($storage_path, $filename, $headers);

或者您可以使用存储::get()

但是这个需要你获取类型。

$content = Storage::get($path);
return response($content)->header('Content-Type', $type);
/**
 * .
 * ├── public
 * │   ├── myimage.jpg
 * 
 * example.com/myimage.jpg
 */

存储目录用作各种Laravel服务,如会话、缓存、编译的视图模板。此目录必须可由web服务器写入。此目录是由Laravel维护,您无需对其进行修补。