Обработка изображений не обновляется в кеше

На странице, где пользователи могут поворачивать загруженное изображение, есть кнопка для поворота изображения. Это делается с помощью изображения Intervention, но тот же результат (и проблема) был достигнут с использованием PHP.

Проблема в том, что поворот изображения работает, но повернутое изображение не отображается в браузере. Вероятно, это связано с кешем, потому что при ручной очистке кеша в браузере действительно показывается повернутая картинка.

public function rotate($picture_id) {

    // get picture location
    $path = Picture::where('id',$picture_id)->first()->location;

    // Rotate the picture
    $path_orig = storage_path('app/public/'.$path);
    $img_orig = Image::make($path_orig)
                ->rotate(-90)
                ->save($path_orig);

    // Rotate thumbnails etc
    ...

    return Redirect::back();
}

РЕШЕНИЕ Обновите имя файла, указав случайную строку.

public function rotate($picture_id) {

    // get picture location
    $path = Picture::where('id',$picture_id)->first()->location;

    // Path to picture
    $path_orig = storage_path('app/public/'.$path);
    $path_s = public_path($path);

    // New path
    do {
        $newKey = str_random(40);
        $ext = File::extension($path_orig);
        $dir = dirname($path_orig);
        $path_L_new = $dir.'/'.$newKey.'.'.$ext;
        $path_S_new = public_path('folder/'.$newKey.'.'.$ext);
    }
    while ( count(Picture::where('location',$path_L_new)->get()) > 0 );

    // Rotate images
    $img_L_new = Image::make($path_orig)
                ->rotate(-90)
                ->save($path_L_new);

    $img_S_new = Image::make($path_s)
                ->rotate(-90)
                ->save($path_S_new);

    // Delete old files
    Storage::delete($path);
    File::delete(public_path($path));

    // Update location
    $pic = Picture::where('id',$picture_id)->first()->update(array('location' => 'folder/'.$newKey.'.'.$ext));

    // Show new picture
    return Redirect::back();

}

person Michiel van Nesselrooij    schedule 24.05.2018    source источник


Ответы (1)


Вы должны добавить случайную или уникальную строку в источник изображения:

<img src="/path/to/file.jpg{{ time() }}">

Но будьте осторожны, не добавляйте новую случайную строку в конец src изображения, когда изображение не обновляется. Если вы это сделаете, изображение не будет кэшировано.

Правильный способ: при обновлении изображения лучше сохранить случайную строку для этого изображения и сохранить ее в базе данных. И при отображении изображений добавьте к нему случайную строку одноранговой сети. Не генерируйте новую случайную строку при каждом вызове.

person AliN11    schedule 24.05.2018
comment
Превосходно! Я использовал вашу логику в немного другом решении: поскольку само имя файла уже является случайной строкой, я просто сохраняю файл с новым случайным именем и обновляю базу данных. Спасибо! - person Michiel van Nesselrooij; 25.05.2018