我试图保存一个被操纵的图像,我将把它们推到s3。
我的代码此代码将图像直接保存在公用文件夹*
中public function store(Filesystem $filesystem)
{
$request = Input::all();
$validator = Validator::make($request, [
'images' => 'image'
]);
if ($validator->fails()) {
return response()->json(['upload' => 'false']);
}
$postId = $request['id'];
$files = $request['file'];
$media = [];
$watermark = Image::make(public_path('img/watermark.png'));
foreach($files as $file) {
$image = Image::make($file->getRealPath());
$image->crop(730, 547);
$image->insert($watermark, 'center');
$image->save($file->getClientOriginalName());
}
}
我想要实现的是能够将其保存在自己的文件夹中。首先,在公共文件夹的存储中,为博客帖子存储图像的最佳位置是什么?但无论如何,当我这样做时:
$image->save('blogpost/' . $postId . '/' . $file->getClientOriginalName());
// Or this
$image->save(storage_path('app/blogpost/' . $postId . '/' . $file->getClientOriginalName()));
我收到错误:
公共 中的文件夹
Image.php第138行中的NotWritableException:无法将图像数据写入 路径(blogpost / 146 / cars / image.jpg)
或
存储路径
Image.php第138行中的NotWritableException:无法将图像数据写入 路径/ code/websites/blog/storage/app/blogpost/146/image.jpg
我试过
cd storage/app/
chmod -R 755 blogpost
它仍然无法正常工作
感谢您阅读本文
答案 0 :(得分:5)
好的,这就是我如何解决它,我在存储之前首先制作了目录,
Storage::disk('local')->makeDirectory('blogpost/' . $postId);
创建文件夹后,我继续存储被操纵的图像,如下所示:
$image->save(storage_path('app/blogpost/' . $postId . '/' . $imageName));
然后将图像推送到S3
$filesystem->put('blogpost/' . $postId . '/' . $imageName, file_get_contents(storage_path('app/blogpost/' . $postId . '/' . $imageName)));
这有效
答案 1 :(得分:3)
您可以使用函数Intervation/Image
将stream
变量强制转换为数据流来解决此问题。然后使用Storage
Laravel外观来保存图像。
$img = Image::make('path-to-the-image.png')->crop(...)->insert->stream('jpg', 90)
Storage::put('where_I_want_the_image_to_be_stored.jpg', $img);
答案 2 :(得分:2)
Laravel 5需要写入整个Storage
文件夹的权限,因此请尝试关注,
sudo chmod 755 -R storage
如果755
无效,请尝试777
。
答案 3 :(得分:2)
正在改善@Amol Bansode的答案。
您收到此错误,因为您指定的路径中不存在$ \gdb ./a.out
GNU gdb (GDB) 7.9.1
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-unknown-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./a.out...done.
(gdb) rbreak Test::Say()
Breakpoint 1 at 0x400626: file main.cpp, line 12.
void Test::Say();
(gdb) r
Starting program: /home/rbreak/a.out
Breakpoint 1, Test::Say (this=0x7fffffffdd7f) at main.cpp:12
12 printf("Hello word!");
(gdb)
文件夹。
你可以这样做:
$postId
答案 4 :(得分:0)
在我的情况下,我将项目从 Windows 10迁移到 Parrot (Debian- Linux ),我遇到了同样的问题,结果证明了斜杠是反斜杠,Linux以不同的方式解释它们。与Windows不同,它并不重要。
Windows Code:
$image_resize->save(public_path('\storage\Features/' .'Name'.".".'png'));
Linux Code (Working):
$image_resize->save(public_path('storage/Features/' .'Name'.".".'jpg'));
答案 5 :(得分:0)
我知道这个问题与 Laravel 相关,但我是在将它用于 WordPress 时遇到的。如果有人来自 WordPress 世界,则此代码有效(我遇到相同的“无法写入”错误)并且更改目录权限将无效,因为库可能需要相对路径(下面的代码对于通过以下方式直接安装 Intervention 有效composer 到任何 PHP 应用程序中,而不是 Laravel 本身)-
require 'vendor/autoload.php';
use Intervention\Image\ImageManager;
$manager = new ImageManager(array('driver' => 'imagick'));
$image = $manager->make('PUBLIC IMAGE URL/LOCAL IMAGE PATH');
$image->crop(20, 20, 40, 40);
$image->save(__DIR__ . '/img/bar.png');