Загрузка на S3 с изображением Laravel Intervention возвращает логическое значение, а не путь - PullRequest
3 голосов
/ 27 июня 2019

У меня проблема с загрузкой изображения в Laravel. Иногда изображение требует переориентации - при выполнении этого с изображением Intervention оно просто возвращает логическое значение вместо пути изображения в s3. При использовании без вмешательства изображения работает нормально

Я пытался читать данные exif и использовать imagerotate безрезультатно, он выдает ошибку

Я запускаю следующее

$image = $request->file('photo');
$path = \Storage::disk('s3')->put('users/'.\Auth::id().'/posts', $image, 'public');
dd($path); // /users/1/posts/39grjigrje.jpg

переменная $path великолепна и является путем s3, однако работает:

$image = $request->file('photo');
$image = \Image::make($image);
$image->orientate();
$path = \Storage::disk('s3')->put('users/'.\Auth::id().'/posts', $image, 'public');
dd($path); // true

переменная $path просто логическая и не возвращает путь к сохраненному файлу

Я ожидаю путь, например /images/1/kfjeieuge.jpg, который я получаю, когда не использую изображение вмешательства, когда я использую вмешательство, я получаю логическое значение.

Ответы [ 4 ]

2 голосов
/ 02 июля 2019

Я тоже столкнулся с той же проблемой несколько лет назад.Я решил это, выполнив следующие действия:

1. Возможно, вам придется кодировать изображение после операции над ним.Для достижения кодирования обратитесь к этой документации по методу потока: Создание потока закодированного изображения

Кодирует текущее изображение в заданном формате и с заданным качеством изображения и создает новый поток PSR-7 на основе изображенияdata.

$image = Image::make(request()->file('image'))->orientate()->encode('jpg');

2. А затем сохраните его в потоке

$path = Storage::disk('s3')->put('users/'.\Auth::id().'/posts', $image->stream(),'public');

Это должно достичь вашей цели.

1 голос
/ 05 июля 2019

В первом примере:

$image = $request->file('photo');
$path = \Storage::disk('s3')->put('users/'.\Auth::id().'/posts', $image, 
'public');

$ request-> file ('photo') file вернет экземпляр класса Illuminate \ Http \ UploadedFile. Вы можете проверить это здесь в документации ссылка .

И, как сказал Тарун, "положить" метод проверки для экземпляра класса Illuminate \ Http \ UploadedFile. Таким образом, в этом случае он будет успешно загружен.

Во втором примере:

$image = $request->file('photo');
$image = \Image::make($image); //here
$image->orientate();
$path = \Storage::disk('s3')->put('users/' . \Auth::id() . '/posts', $image, 'public');

Перезаписывается переменная '$ image' с помощью экземпляра класса Image (вторая строка). Что не так. Вам необходимо передать поток или файл.

Попробуйте код ниже:

$image = $request->file('photo');
$image = \Image::make($image); //here
$image->orientate()->encode('jpg');
$filename = time() . '.jpg';
$path = \Storage::disk('s3')->put('users/' . \Auth::id() . '/posts/'.$filename, $image->getEncoded(), 'public');
0 голосов
/ 06 июля 2019

Попробуйте это

$image = \Image::make($request->file('photo')->getRealpath());
$image->orientate();


$image->encode('jpg');
 OR
$image->response('jpg', 100);


$path = \Storage::disk('s3')->put('users/'.\Auth::id().'/posts', $image, 'public');
0 голосов
/ 02 июля 2019

Вы можете решить эту проблему, как описано ниже по ссылке

https://laracasts.com/discuss/channels/laravel/saving-an-intervention-image-instance-into-amazon-s3

$path = \Storage::disk('s3')->put('users/'.\Auth::id().'/posts', $image->stream()->__toString(), 'public');

Обновление: 5 июля

Если вы посмотритев исходном коде он должен возвращать только bool

https://github.com/laravel/framework/blob/c7bdf66062af3c63648f7c29591476e6db92c885/src/Illuminate/Filesystem/FilesystemAdapter.php#L192

/**
     * Write the contents of a file.
     *
     * @param  string  $path
     * @param  string|resource  $contents
     * @param  mixed  $options
     * @return bool
     */
    public function put($path, $contents, $options = [])
    {
        $options = is_string($options)
                     ? ['visibility' => $options]
                     : (array) $options;
        // If the given contents is actually a file or uploaded file instance than we will
        // automatically store the file using a stream. This provides a convenient path
        // for the developer to store streams without managing them manually in code.
        if ($contents instanceof File ||
            $contents instanceof UploadedFile) {
            return $this->putFile($path, $contents, $options);
        }
        return is_resource($contents)
                ? $this->driver->putStream($path, $contents, $options)
                : $this->driver->put($path, $contents, $options);
    }

И, как вы можете видеть, Stream и file обрабатываются по-разному

И идеальным вариантом является использование url функции для получения URL

Storage::disk('s3')->url($filename)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...