【问题标题】:Laravel S3 image upload creates a folder with the filename automaticallyLaravel S3 图片上传会自动创建一个带有文件名的文件夹
【发布时间】:2018-07-24 18:43:30
【问题描述】:

我正在使用 Laravel 5.4.*。我在帮助文件中有这个简单的代码,用于在名为“instant_gifs/”的文件夹下的 S3 存储桶中上传图像/gif。代码如下:

if ( !function_exists('uploadFile') ) {

function uploadFile($fileContent, $fileName, $size='full', $disk='s3')
{
    $rv = '';
    if( empty($fileContent) ) {
        return $rv;
    }

    if($size == 'full') {
        dump($fileName);

        $path = Storage::disk($disk)->put(
                    $fileName,
                    $fileContent,
                    'public'
                );
    }

    if ( $path ) {
        $rv = $fileName;
    }

    return $rv;
}

}

从控制器中,我调用辅助方法如下:

$file = $request->gif;
$file_name = 'instant_gifs/' . $user_id . '_' . time() . '_' . $file->getClientOriginalName();
$result = uploadFile($file, $file_name);

在 helper 方法的 $fileName 参数中,我以这种格式提供文件名,例如:

“instant_gifs/83_1518596022_giphy.gif”

但上传后,我看到文件存储在此文件夹下

“vvstorage/instant_gifs/83_1518596022_giphy.gif/CRm1o1YEcvX3fAulDeDfwT7DIMCxOKG8WFGcA3lB.gif”

随机文件名

CRm1o1YEcvX3fAulDeDfwT7DIMCxOKG8WFGcA3lB.gif

然而,根据代码,它应该存储在这个路径中:

“vvstorage/instant_gifs/83_1518596022_giphy.gif”

没有得到任何解释为什么会发生这种情况。任何线索将不胜感激。

BucketName = vvstorage
我正在模仿的文件夹 = instant_gifs

【问题讨论】:

标签: php laravel laravel-5 amazon-s3 file-upload


【解决方案1】:

经过一些研究和测试,发现了问题。 put() 方法需要第二个参数作为文件内容或流而不是文件对象。在我的代码中,我将文件作为$file = $request->gif;$file = $request->file('gif'); 发送,希望 Storage 类能够隐式获取文件内容。但是为了得到预期的结果,我需要从控制器调用辅助方法,如下所示。注意 file_get_contents() 部分。

$file = $request->gif;
$file_name = 'instant_gifs/' . $user_id . '_' . time() . '_' . $file>getClientOriginalName();
$result = uploadFile( file_get_contents($file), $file_name );

现在,我将图像正确存储在正确的路径下,例如/instant_gifs/9_1518633281_IMG_7491.jpg

现在,让我比较/总结实现相同结果的可用方法:

1)put():

 $path = Storage::disk('s3')->put(
                    '/instant_gifs/9_1518633281_IMG_7491.jpg', #$path
                    file_get_contents($request->file('gif')), #$fileContent
                   'public' #$visibility

已将其存储在/vvstorage/instant_gifs/9_1518633281_IMG_7491.jpg

2) putFileAs():为了实现与putFileAs() 相同的功能,我需要编写如下。第一个参数需要目录名称,我将其留空,因为我通过文件名模仿 s3 中的目录名称。

$path = Storage::disk('s3')->putFileAs(
                '', ## 1st parameter expects directory name, I left it blank as I'm mimicking the directory name through the filename
                '/instant_gifs/9_1518633281_IMG_7491.jpg',
                $request->file('gif'), ## 3rd parameter file resource
                ['visibility' => 'public'] #$options
            );

已将其存储在/vvstorage/instant_gifs/9_1518633281_IMG_7491.jpg

3)storeAs()

$path = $request->file('gif')->storeAs(
             '', #$path
             '/instant_gifs/9_1518633281_IMG_7491.jpg', #$fileName
             ['disk'=>'s3', 'visibility'=>'public'] #$options
             );    

已将其存储在/vvstorage/instant_gifs/9_1518633281_IMG_7491.jpg

附加:: 4) 通过put() 存储缩略图。流()的例子...

$imgThumb = Image::make($request->file('image'))->resize(300, 300)->stream(); ##create thumbnail
        $path = Storage::disk('s3')->put(
                    'profilethumbs/' . $imgName,
                    $imgThumb->__toString(),
                    'public'
                );

希望它可以帮助某人。

【讨论】:

    【解决方案2】:

    1.) 为什么网址中有vvstorage

    它附加了该路由,因为您在configuration 中的configuration 中的root 文件夹设置为vvstorage,因此每当您上传到S3 时,所有文件都会以vvstorage 开头。

    2.) 为什么即使你传递了文件名也是随机名称?

    因为在使用put 时,文件会生成unique ID 并将其设置为文件名,因此无论您传递什么,它都不会以您想要的名称保存文件。但是如果你使用putFileAs,那么你可以覆盖put的默认行为并传递文件名。

    希望这可以澄清它

    【讨论】:

    • 1) “vvstorage”是主Bucket,它总是在文件的URL中。没问题。 2) 您可能将putputFile 方法混淆了。 putFile 将自动生成唯一的文件名。 put 方法应该将文件存储在磁盘Laravel Storing Files 的给定路径中。与put 相同的代码在上传个人资料图片时有效,但由于某种原因在文件上传部分无效。谢谢!
    • 我说的是putFileAs 不是putFile
    • Put 应该也可以工作,因为我提供了一个文件路径来存储。顺便说一句,我在上面的 uploadFile 代码中尝试了putFileAs$path = Storage::disk($disk)->putFileAs( 'instant_gifs/9_1518602282_IMG_9594.jpg', $fileContent, 'public' ); 它现在存储在此路径 instant_gifs/9_1518602282_IMG_9594.jpg/public 中,图像名称为“public”。可能需要处理存储桶访问策略。
    • 可能是,但您仍然可以使用原始名称访问它,无论存储以什么名称保存它
    猜你喜欢
    • 1970-01-01
    • 2016-08-30
    • 2019-01-07
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 2014-02-14
    • 2021-01-13
    • 1970-01-01
    相关资源
    最近更新 更多