laravel 使用Storage::fake进行测试时,无法检索文件的file_size

xxhby3vn  于 2023-04-13  发布在  其他
关注(0)|答案(3)|浏览(221)

我刚刚将我的应用从Laravel v8升级到v9。现在我遇到了以下代码引发的问题:

  • League\Flysystem\UnableToRetrieveMetadata:无法检索位于以下位置的文件的file_size:test_file.xlsx. *

我的控制器:

<?php

namespace App\Http\Controllers\Reports;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Storage;

class ReportDownloadController extends Controller
{
    /**
     * Handle the incoming request.
     *
     * @param string $path
     * @return \Symfony\Component\HttpFoundation\StreamedResponse
     */
    public function __invoke(string $path): \Symfony\Component\HttpFoundation\StreamedResponse
    {
        return Storage::disk('temp')->download($path, request()->query('filename'));
    }
}

相关测试:

/** @test */
    public function it_returns_a_file_download_with_the_provided_filename_presented_to_the_user()
    {
        $this->withoutExceptionHandling();

        Storage::fake('temp');
        $fakeFile = UploadedFile::fake()->create('test_file.xlsx');
        Storage::disk('temp')->put('test_file.xlsx', $fakeFile);

        $response = $this->actingAs($this->user)
            ->getJson(route('reports.download', ['path' => 'test_file.xlsx', 'filename' => 'Appropriate.xlsx']));

        $response->assertDownload('Appropriate.xlsx');
    }

我知道Flysystem已经更新到v3,但我似乎不知道如何解决这个问题。
我甚至创建了一个空的Laravel 9应用程序,用下面的代码进行测试,仍然得到相同的错误,所以我不认为这是我的应用程序。

public function test_that_file_size_can_be_retrieved()
    {
        Storage::fake('local');
        $fakeFile = UploadedFile::fake()->create('test_file.xlsx', 10);
        Storage::disk('local')->put('test_file.xlsx', $fakeFile);

        $this->assertEquals(10, (Storage::disk('local')->size('test_file.xlsx') / 1024));
    }

少了什么?

cl25kdpy

cl25kdpy1#

我在从Laravel 8切换到Laravel 9时遇到了同样的问题。
错误 Unable to retrieve the file_size 实际上是抛出的,因为它在提供的路径中根本找不到文件。
在我的例子中,原来提供给下载功能的路径是以/开始的,这不是导致Flysystem 2出现问题的原因,但显然是Flysystem 3出现问题。
鉴于你所展示的测试,它看起来不像是这里的问题,但无论如何,这可能会有所帮助。

pgky5nke

pgky5nke2#

所以结果是我的测试沿着都被破坏了。我应该使用$fakeFile-〉hashName(),并且我的文件名应该在我的Storage::put()中的路径中有'/'。
以下是按预期通过的更正测试:

/** @test */
    public function it_returns_a_file_download_with_the_provided_filename_presented_to_the_user()
    {
        $this->withoutExceptionHandling();

        Storage::fake('temp');
        $fakeFile = UploadedFile::fake()->create('test_file.xlsx');
        Storage::disk('temp')->put('/', $fakeFile);

        $response = $this->actingAs($this->user)
            ->getJson(route('reports.download', ['path' => $fakeFile->hashName(), 'filename' => 'Appropriate.xlsx']));

        $response->assertDownload('Appropriate.xlsx');
    }

public function test_that_file_size_can_be_retrieved()
    {
        Storage::fake('local');
        $fakeFile = UploadedFile::fake()->create('test_file.xlsx');
        Storage::disk('local')->put('/', $fakeFile);

        $this->assertEquals(0, Storage::disk('local')->size($fakeFile->hashName()));
    }

谢谢,@yellaw。你关于无法在提供的路径中找到文件的评论帮助我意识到我做了一些愚蠢的事情。

mrzz3bfm

mrzz3bfm3#

在投入大量时间后,找到了解决方案。

$file_name = storage_path('database_backup_on_' . date('y-m-d') . '.sql');
return response()->download($file_name);

相关问题