Laravel Response::download() 函数图片问题

Posted

技术标签:

【中文标题】Laravel Response::download() 函数图片问题【英文标题】:Laravel Response::download() function image issue 【发布时间】:2015-11-17 22:23:59 【问题描述】:

我正在使用 Laravel 5。我正在创建各种照片库。当您单击我使用的图像时

Response::download($path,$filename,$headers);

启动文件下载。

下面是我的代码:

路线

Route::get('test/filename', 'ImageController@getDownload');

当用户访问 test/example.png 时,它会运行 getDownload 函数

控制器

public function getDownload($filename)
    // Define the path and the extension
    $file = public_path() . "/uploads/" . $filename;
    $ext = pathinfo($filename, PATHINFO_EXTENSION);

    if($ext == 'png' || 'PNG')
      $headers = array(
          'Content-Type:image/png',
        );
    

    else if($ext == 'jpg' || 'jpeg' || 'JPEG' || 'JPG')
      $headers = array(
          'Content-Type:image/jpeg',
        );
      

      else if($ext == 'gif' || 'GIF')
      $headers = array(
          'Content-Type:image/gif',
        );
      

      $response = Response::download($file, $filename, $headers);

      return $response;


在这个函数中,我声明了我的文件的路径并设置了下载。

查看

@foreach ($fileList as $uploadedFiles)
    <div class='img'>
    <a href="test/$uploadedFiles"/><img src=" $uploadsFolder/   $uploadedFiles "/></a>
    </div>  

@endforeach

在我看来,我使用循环来获取文件名,然后创建一个指向 test/$filename 的链接,该链接调用控制器中的方法。

问题

使用这种方法似乎很有效,因为我可以下载 docx 文件、PDF、txt 文件、csv 文件等。但是,当下载图像时,当我打开它时,我得到“图像无法显示”。

在我的上传文件夹中,我有一张名为 cake.JPG 的图片。

当我下载这个请求头如下:

接受:text/html,application/xhtml+xml,image/jxr, 接受编码:gzip、放气 接受语言:en-GB 连接:保持活动状态 的Cookie:XSRF-TOKEN = eyJpdiI6ImhMYUJwRThtMWY3eFozblRibkVzQkE9PSIsInZhbHVlIjoiMUxBZzRPTXVkYU9pWXhnWjdYcGlPNlFcL0I1UWViN0QwcDlnbXNsMTE5cExqVk1KZlh0WGhKaldyYVMrVVo0XC9LMnNNODFLZjlQQmZTdFpQRUVKTklldz09IiwibWFjIjoiYTIxODNiYmVmNDc0ZjMzOTQ2YzI1MmM2ZTQ1OGIwNmE4YWVjOTQ0OTYwZjRiMThmMGFiMjc0NjNmN2FlMDQyOCJ9; laravel_session = eyJpdiI6ImxTS3dUayt1UnRNMlhlS0ZrNlVLU1E9PSIsInZhbHVlIjoiZGVWVmJcL3FIc09pQnQxdHlnSzJcL1J3UzhYTnl6WjNxY3crZ3BreXNqb09sdWY1OXlaRkE2YW1pUDhBZ2Frc2ZPMEFWNlg3MkRrTmI1MFhWXC9UOFdiWVE9PSIsIm1hYyI6Ijk2NTQ0MzkzMDExMmI2MzJmZGM0NGI4Yzk4Yzc4NzhmYTYyODIwNzFiYzA2ZDQ5NDk5ZjY3MDY0NDZmOTVkZTIifQ%3D%3D LI> 主机:本地主机 推荐人:http://localhost/lara-mvc/public/gallery 用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240

响应头如下:

连接:保持活动状态 的Cookie:XSRF-TOKEN = eyJpdiI6ImhMYUJwRThtMWY3eFozblRibkVzQkE9PSIsInZhbHVlIjoiMUxBZzRPTXVkYU9pWXhnWjdYcGlPNlFcL0I1UWViN0QwcDlnbXNsMTE5cExqVk1KZlh0WGhKaldyYVMrVVo0XC9LMnNNODFLZjlQQmZTdFpQRUVKTklldz09IiwibWFjIjoiYTIxODNiYmVmNDc0ZjMzOTQ2YzI1MmM2ZTQ1OGIwNmE4YWVjOTQ0OTYwZjRiMThmMGFiMjc0NjNmN2FlMDQyOCJ9; laravel_session = eyJpdiI6ImxTS3dUayt1UnRNMlhlS0ZrNlVLU1E9PSIsInZhbHVlIjoiZGVWVmJcL3FIc09pQnQxdHlnSzJcL1J3UzhYTnl6WjNxY3crZ3BreXNqb09sdWY1OXlaRkE2YW1pUDhBZ2Frc2ZPMEFWNlg3MkRrTmI1MFhWXC9UOFdiWVE9PSIsIm1hYyI6Ijk2NTQ0MzkzMDExMmI2MzJmZGM0NGI4Yzk4Yzc4NzhmYTYyODIwNzFiYzA2ZDQ5NDk5ZjY3MDY0NDZmOTVkZTIifQ%3D%3D LI> 主机:本地主机 推荐人:http://localhost/lara-mvc/public/gallery 用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240 [...] 接受范围:字节 缓存控制:公共 连接:保持活动状态 内容处置:附件;文件名="cake.jpg" 内容长度:115453 内容类型:图片/jpeg 日期:2015 年 8 月 24 日星期一 12:59:21 GMT 保持活动状态:超时=5,最大值=100 最后修改时间:2015 年 8 月 24 日星期一 11:51:57 GMT 服务器:Apache/2.4.10 (Win32) OpenSSL/1.0.1i php/5.6.3 的Set-Cookie:laravel_session = eyJpdiI6InV3M2d3QWNtVXc4Z09DUUhia0tRQlE9PSIsInZhbHVlIjoiSFFDM3lpZEs2cDZUbXdQVGVPV0c5RkVISkRXcmpac2dYQ2dMVHVCT0docTU0RlRFYWV3bURDaHBQZUpIQ0NKZ3crMitFVzM4Mlo2dTBnaTVsN1ZLdXc9PSIsIm1hYyI6IjU1MTIxNTg3YWQzOWMxZDMxNmM4NzZlZjllMTNiZGRkNDQ5ZjhhOWQ2MWEyMGQwOGEwOTM1ZjYzNzliY2ZmNDMifQ%3D%3D;过期=格林威治标准时间 2015 年 8 月 24 日星期一 14:59:22;最大年龄=7200;路径=/; httponly 的Set-Cookie:XSRF-TOKEN = eyJpdiI6IkFzWmZqQm93cU55VCtTVjJjcEI1b1E9PSIsInZhbHVlIjoiT0JqVEtVNENMNTNKUllTNG9oSDBvY215VGU5eGZqMkRJQXdORDVTOGkyV1loZ3h4WkVrSGptNG5wZ0Fuc3Q1RFRUWHUza0MrUEtKS0pOaiszV3Y4Ymc9PSIsIm1hYyI6IjFlMTUyMDZlZjBjYTdiMjRlMGZmN2JmOGEyMTdiNzFlYmViZGI1ZjVhMzQyNGVlMWNiMTI0MjVkZTZhNTdlYjAifQ%3D%3D;过期=格林威治标准时间 2015 年 8 月 24 日星期一 14:59:22;最大年龄=7200;路径=/ X-Powered-By:PHP/5.6.3

尤其是图片,我是否错误地设置了标题?

提前谢谢你。

【问题讨论】:

【参考方案1】:

在这种情况下处理图像时,您有两种选择。

1.下载图片

这意味着,文件将被提示下载。在这种情况下,您应该始终设置此标头(在这种情况下,文件本身的 mimetype 并不重要):

Content-Type: application/octet-stream
Content-Disposition: attachment; filename="somefilename.someextension"

这对于任何类型的文件都是一样的,它只是强制下载的通用方式。确保文件名已相应设置。

注意:这只是为了解释。当使用 download() 时,Laravel 会自己构建这些头文件。只需确保您没有使用此方法包含 Content-type 标头即可。

2。显示图片

在这种情况下,图像将显示为常规图像。在这里,您应该设置 Content-Disposition 标头,而只设置 Content-type 标头:

Content-Type: image/jpeg

这个要根据图片对应的mimetype来设置。

在 Laravel 中:

你应该使用类似下面的东西而不是 download() 方法:

$response = Response::make($file, 200)->withHeaders($headers);

【讨论】:

以上是关于Laravel Response::download() 函数图片问题的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:laravel 可翻译插件

win 怎么laravel命令

laravel 安装失败

laravel validator怎么验证整数

Laravel 图像规则验证不适用于 Laravel 8,但适用于 Laravel 7 |拉拉维尔 |图片 |验证

laravel和mongo怎么搭配使用