Laravel S3 图片上传自动创建一个文件名的文件夹
Laravel S3 image upload creates a folder with the filename automatically
我正在使用 Laravel 5.4.*。我在一个帮助文件中有这个简单的代码,用于将 images/gif 上传到名为 say "instant_gifs/" 的文件夹下的 S3 存储桶中。代码如下:
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);
在辅助方法的 $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
?
附加该路由是因为 configuration
中 S3
的 root
文件夹设置为 vvstorage
,因此每当您上传到 S3
所有文件都将以 vvstorage
.
为前缀
2.) 为什么在传递文件名时随机命名?
因为当使用 put
时,文件将生成 unique ID
并设置为它的文件名,所以无论您传递什么,它都不会以您想要的名称保存文件。但是,如果您使用 putFileAs
,那么您可以覆盖 put
的默认行为并传递文件名。
希望这能说明问题
经过一些研究和测试,发现了问题。 put()
方法需要第二个参数作为文件内容或流而不是文件对象。在我的代码中,我将文件作为 $file = $request->gif;
或 $file = $request->file('gif');
发送,希望 Storage class 将隐式获取文件内容。但是为了获得预期的结果,我需要从控制器调用辅助方法,如下所示。注意 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
。
现在,让我compare/summarize实现相同结果的可用方法:
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()
存储缩略图。 stream() 示例 ...
$imgThumb = Image::make($request->file('image'))->resize(300, 300)->stream(); ##create thumbnail
$path = Storage::disk('s3')->put(
'profilethumbs/' . $imgName,
$imgThumb->__toString(),
'public'
);
希望对大家有所帮助。
我正在使用 Laravel 5.4.*。我在一个帮助文件中有这个简单的代码,用于将 images/gif 上传到名为 say "instant_gifs/" 的文件夹下的 S3 存储桶中。代码如下:
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);
在辅助方法的 $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
?
附加该路由是因为 configuration
中 S3
的 root
文件夹设置为 vvstorage
,因此每当您上传到 S3
所有文件都将以 vvstorage
.
2.) 为什么在传递文件名时随机命名?
因为当使用 put
时,文件将生成 unique ID
并设置为它的文件名,所以无论您传递什么,它都不会以您想要的名称保存文件。但是,如果您使用 putFileAs
,那么您可以覆盖 put
的默认行为并传递文件名。
希望这能说明问题
经过一些研究和测试,发现了问题。 put()
方法需要第二个参数作为文件内容或流而不是文件对象。在我的代码中,我将文件作为 $file = $request->gif;
或 $file = $request->file('gif');
发送,希望 Storage class 将隐式获取文件内容。但是为了获得预期的结果,我需要从控制器调用辅助方法,如下所示。注意 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
。
现在,让我compare/summarize实现相同结果的可用方法:
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()
存储缩略图。 stream() 示例 ...
$imgThumb = Image::make($request->file('image'))->resize(300, 300)->stream(); ##create thumbnail
$path = Storage::disk('s3')->put(
'profilethumbs/' . $imgName,
$imgThumb->__toString(),
'public'
);
希望对大家有所帮助。