将Laravel文件下载到私有文件系统中时损坏

时间:2018-12-24 08:16:33

标签: laravel laravel-5

我需要为我的网站创建私有文件系统。每个用户都应该能够看到自己的文件。为此,我创建了一个如下的类GetFile

<?php


namespace App\Http\Tasks;


class GetFile
{
    private static $localFilePath = "attached_files";

    public static function getFile($filename)
    {
        return response()->download(storage_path(self::$localFilePath ."/".$filename, null, [], null));
    }
}

然后我按照以下步骤创建了一个GetFileController控制器

namespace App\Http\Controllers;

use App\Http\Tasks\GetFile;

class GetFileController extends Controller
{
    public function get_file($file_name)
    {
        return GetFile::getFile($file_name);
    }
}

然后是一条路线

Route::group(['middleware' => ['web','auth'], 'namespace' => 'App\Http\Controllers'], function () {
    Route::get('get_file/{file_name}', 'GetFileController@get_file')->name('file.get_file');
});

现在

route('file.get_file', $filename)

是指向$filename的链接。当有人尝试查看文件时,我可以使用控制器的get_file函数中的某些逻辑来控制访问。

问题是当我通过这种方法下载文件(图像)时,Windows操作系统显示文件已损坏或太长,无法打开文件。我真的很困惑,我已经以这种方式创建了私有文件系统,并且一切都正确,但是这次有些事情变得很棘手。我检查了服务器上的文件,它们没有问题,所以我认为下载功能中应该有问题。

谢谢

2 个答案:

答案 0 :(得分:2)

可能是由于未清除输出缓冲区。

ob_end_clean();

以上内容应清除缓冲区,因此请在下载内容之前使用它。

答案中有更多信息: Laravel 5 file downloads invalid

答案 1 :(得分:1)

可能是空格破坏了header()函数。

尝试一下:

public static function getFile($filename)
{
   ob_end_clean();
   $headers = array(
     'Content-Type: image/png',
   );
   return response()->download(storage_path(self::$localFilePath ."/".$filename, $headers));
}