Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel S3图像上载会自动创建一个文件名为的文件夹_Php_Laravel_Laravel 5_Amazon S3_File Upload - Fatal编程技术网

Php Laravel S3图像上载会自动创建一个文件名为的文件夹

Php Laravel S3图像上载会自动创建一个文件名为的文件夹,php,laravel,laravel-5,amazon-s3,file-upload,Php,Laravel,Laravel 5,Amazon S3,File Upload,我使用的是Laravel 5.4.*。我在一个助手文件中提供了这个简单的代码,可以在名为say“instant_gifs/”的文件夹下的S3 bucket中上传images/gif。代码如下: if ( !function_exists('uploadFile') ) { function uploadFile($fileContent, $fileName, $size='full', $disk='s3') { $rv = ''; if( empty($fileConten

我使用的是Laravel 5.4.*。我在一个助手文件中提供了这个简单的代码,可以在名为say“instant_gifs/”的文件夹下的S3 bucket中上传images/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;
}

}
从控制器中,我调用helper方法,如下所示:

$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

1。)为什么url中有
vvstorage

它附加该路由是因为
S3
configuration
中的
root
文件夹设置为
vvstorage
,因此每当您上传到
S3
时,所有文件都将以
vvstorage
作为前缀

2.)为什么在传递文件名时仍使用随机名称

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


希望这能澄清问题

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

$file = $request->gif;
$file_name = 'instant_gifs/' . $user_id . '_' . time() . '_' . $file>getClientOriginalName();
$result = uploadFile( file_get_contents($file), $file_name );
现在,我将图像正确地存储在正确的路径下,例如在
/instant\u gifs/9\u 1518633281\u IMG\u 7491.jpg

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

1) :

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

2) :为了使用
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) :

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

附加服务:: 4) 用于通过
put()
存储缩略图。流()的示例


希望它能帮助别人

1)“vvstorage”是主存储区,它将始终位于文件URL中。没问题。2) 您可能将
put
putFile
方法混淆
putFile
将自动生成唯一的文件名
put
方法应该将文件存储在磁盘中给定的路径中。上载配置文件图像时,与
put
相同的代码起作用,但由于某些原因,在文件上载部分不起作用。谢谢我说
putFileAs
不是
putFile
Put
也应该可以,因为我提供了一个文件路径来存储。顺便说一句,我在上面的上传文件代码中尝试了
putFileAs
<代码>$path=Storage::disk($disk)->putFileAs('instant_gifs/9_1518602282_IMG_9594.jpg',$fileContent,'public')
它现在存储在这个路径
instant\u gifs/9\u 1518602282\u IMG\u 9594.jpg/public
,图像名为“public”。可能需要处理Bucket访问策略。可能需要,但无论存储以什么名称保存,您都可以使用原始名称访问它。请选择此项以获得更好的解决方案:
$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
            );
$path = $request->file('gif')->storeAs(
             '', #$path
             '/instant_gifs/9_1518633281_IMG_7491.jpg', #$fileName
             ['disk'=>'s3', 'visibility'=>'public'] #$options
             );    
$imgThumb = Image::make($request->file('image'))->resize(300, 300)->stream(); ##create thumbnail
        $path = Storage::disk('s3')->put(
                    'profilethumbs/' . $imgName,
                    $imgThumb->__toString(),
                    'public'
                );