php - Laravel下载大文件最终找不到
问题描述
我正在开发一个用于销售文件和所有下载文件或超过 500Mb 的电子商务网站。所以为了获得更多保护,我将所有文件存储在存储文件夹中并像这样创建磁盘
'academy' => [
'driver' => 'local',
'root' => storage_path('app/academy'),
],
所以我认为所有文件大小都超过 500Mb 所以我不能简单地使用Responce::download
(两次下载后===服务器关闭内存填满)
所以我在 StackOverflow 中搜索并找到答案#1和#2所以我使用此代码下载文件:
$fs = Storage::disk('academy')->getDriver();
$fileName = $file; //-> path to file
$metaData = $fs->getMetadata($fileName);
$stream = $fs->readStream($fileName);
if (ob_get_level()) ob_end_clean();
return response()->stream(
function () use ($stream) {
while(ob_end_flush());
fpassthru($stream);
},
200,
[
'Content-Type' => $metaData['type'],
'Content-disposition' => 'attachment; filename="' . $metaData['path'] . '"',
]);
并在运行后收到此错误
“在路径中找不到文件:D:/laragon/www/store/storage/app/academy/7FrggloHEjjc72rVJO1jPdF10nJL57MBMBvfwpYE.zip”
在这个文件上
D:\laragon\www\store\vendor\league\flysystem\src\Filesystem.php 第 388 行
public function assertPresent($path)
{
if ($this->config->get('disable_asserts', false) === false && ! $this->has($path)) {
throw new FileNotFoundException($path);
}
}
关于此错误的有趣之处在于,如果将其放入 Windows 资源管理器中打开 zip 文件,则返回的路径(路径正确)
并且已经使用 php artisan storage:link
解决方案
我不知道我对 laravel 框架中存储的了解是错误还是湖:
当您通过存储保存文件时将返回文件的路径,因此我将该路径保存在我的数据库中,当我将此路径提供给上面的代码时返回该错误,所以我决定只发送没有路径的文件名并简单地代码作品。
我希望这个答案对某人有所帮助!
推荐阅读
- google-chrome - Visual Studio 2019 kestrel 调试浏览与 Chrome 切换到端口 5000 而不是端口 5001
- android - 使用 ViewModel 的构造函数依赖注入
- c# - c# OpenQA.Selenium.WebDriverException : for chromedriver.exe (nuget pkg version 2.46.0)
- python - 在函数名称上拆分 SQL 语句,但在 Python 中保留分隔符
- angularjs - 无法使用 angularjs 加载 fusioncharts
- windows - 创建一个 Oracle 钱包以在 Windows 上存储数据库凭证
- ios - 如何使用步进器增加标签值?
- mysql - 更新列以进行快速分析
- scala - 将 Map[String, Any] 转换为案例类的无形代码无法处理可选子结构
- html - 在浏览器中捕捉缩放