Laravel无法返回图像。
Laravel无法返回图像。
我在公共文件夹以外的存储文件夹中有一张图片和一些文本文件。文件夹的结构如下:
storage
|->uploads
并设置了一个路由:
Route::get('storage/{folder}/{filename}','FileController@getFile');
在控制器中,getFile方法的代码如下:
$path = storage_path($folder . DIRECTORY_SEPARATOR . $filename); if (extension_loaded('fileinfo')) { if (!File::exists($path)) { abort(404); } $file = File::get($path); $type = File::mimeType($path); $response = Response::make($file, 200); $response->header("Content-Type", $type); return $response; } else{ abort(412,'请启用fileinfo扩展或联系网站管理员'); }
当我尝试从URL检索图像时,它返回空白图像,如此:
但当我尝试检索文本文件时,它返回文件。
还尝试使用Image::make($path)
和response()->file($path)
,当mime类型为image/*时,输出仍然相同。
所以,如何在不使用公共文件夹的情况下显示我的图像文件的URL?
问题的出现原因是Laravel无法返回图像文件。经过排查,发现文件路径正确,文件也存在。当打印文件路径时,返回的是完整的文件路径,但是在浏览器地址栏或资源管理器中打开文件时却能够正常显示。进一步检查文件夹和文件的权限,发现所有用户都有读取权限。根据对比发现,开发环境可能不同,路径格式也不一样。解决方法是在返回文件的代码中添加文件协议,即在代码或传递给返回方法的路径前添加"file://"。
以下是修改后的代码示例:
public function getFile() { $path = 'file://' . storage_path($folder . DIRECTORY_SEPARATOR . $filename); return response()->file($path); }
通过添加文件协议,使得返回的文件路径能够在浏览器中正常打开。