Laravel 中的文件上传

File uploads in Laravel

我刚开始使用 Laravel 并尝试使用 Dropzone JS 进行文件上传。我可以成功上传文件,但它们会登陆 app/Http/Controllers,在那里它们无法公开访问。

它似乎把这个目录当作根目录,所以如果我指定 /uploads 作为文件夹,那么它们将进入 app/Http/Controllers/uploads(这显然也不好)。使用 ..s 似乎没有任何效果。

这是我上传文件的存储方法:

$ds = DIRECTORY_SEPARATOR;
$storeFolder = '';
if ( ! empty($_FILES)) {
    $tempFile = $_FILES['file']['tmp_name'];
    $targetPath = dirname( __FILE__ ) . $ds. $storeFolder . $ds;
    $targetFile =  $targetPath. $_FILES['file']['name'];
    move_uploaded_file($tempFile,$targetFile);
}

我也尝试了一些我发现的其他方法(如下),但我在 Chrome 的元素检查器中遇到了 500 个错误。

来自官方文档

$path = $request->file('file')->store('uploads');

来自我找到的教程

$file = $request->file('file');
$destinationPath = '/';
$file->move($destinationPath,$file->getClientOriginalName());

来自另一个教程

$uploadedFile = $request->file('file');
$filename = time().$uploadedFile->getClientOriginalName();
Storage::disk('local')->putFileAs(
    '/'.$filename,
    $uploadedFile,
    $filename
);

目前的方法看起来不错,但只需要将文件存储在public/uploads。

改为使用此路径:

$targetPath = public_path().'/uploads/';

我还建议为我们的存储路径创建一个完美的路由,这样当有人添加时 hostname/storage 它不会向其他人显示您的目录,只有文件可以访问

Route::get('storage/{filename}', function ($filename)
{
    $path = storage_path('public/' . $filename);

    if (!File::exists($path)) {
        abort(404);
    }

    $file = File::get($path);
    $type = File::mimeType($path);

    $response = Response::make($file, 200);
    $response->header("Content-Type", $type);

    return $response;
});