我在Laravel本地保存文件,但是我在获取正确的URL和访问文件时遇到问题。
我已经为Artisan设置了一个符号链接:
php artisan storage:link
保存时,我会在名称中添加public/
,因此文件会放在/storage/app/public/
目录中,该目录有效。
if ($request->hasFile('files')) {
$files = array();
foreach ($request->file('files') as $file) {
if ($file->isValid()) {
$name = time() . str_random(5) . '.' . $file->getClientOriginalExtension();
Storage::disk('public')->put($name, $file);
$files[] = $name;
}
}
if (count($files) > 0) {
$response->assets = json_encode($files);
}
}
名称存储在数据库中
["1524042807kdvws.pdf"]
然后通过我的Vue API将资产作为JSON对象的一部分返回
if (count($response->assets) > 0) {
$assets = array();
foreach (json_decode($response->assets, true) as $asset) {
$assets[] = asset($asset);
}
$responses[$key]->assets = $assets;
}
返回http://127.0.0.1:8000/1524042807kdvws.pdf
但是404s。我觉得自己有点困惑,所以任何指针或帮助都会受到赞赏。
答案 0 :(得分:1)
检查此文档。 https://laravel.com/docs/5.5/filesystem#the-public-disk
因为它显示的是
而不是$name = 'public/' . time() . str_random(5) . '.' . $file->getClientOriginalExtension();
你可以拥有
$name = 'time() . str_random(5) . '.' . $file->getClientOriginalExtension();
Storage::disk("public")->put($name, $file); // assuming you have the public disk that comes by default
然后,当您想要获取网址时,可以使用asset
功能
asset('storage/foo.txt');
答案 1 :(得分:0)
所以我在another post
找到了答案我需要将$file
包裹在file_get_contents()
;
Storage::disk('public')->put($name, $file);
而不是我使用的asset()
:
Storage::disk('public')->url($asset['file']);