简体   繁体   English

“无法将图像数据写入路径” - Laravel Image Intervention

[英]"Can't write image data to path" - Laravel Image Intervention

Can't write image data to path (Laravel)无法将图像数据写入路径(Laravel)

I'm not able to save anything to the storage directory in a Laravel project and receive the following error:我无法将任何内容保存到 Laravel 项目中的存储目录并收到以下错误:

无法将图像数据写入路径

I've spent the last three weeks trying to find out why I can't save images to the Storage folder in Laravel with no luck.在过去的三个星期里,我一直在试图找出为什么我无法将图像保存到LaravelStorage文件夹中。 I've scoured StackOverflow and have come to the conclusion that it's probably due to my Docker image.我搜索了 StackOverflow 并得出结论,这可能是由于我的 Docker 映像造成的。 I'd love to use my custom images if possible but get them working.如果可能,我很想使用我的自定义图像,但让它们工作。 Here's my setup:这是我的设置:

Dockerfile (base image) Dockerfile(基础镜像)

ARG VERSION=7.4
FROM php:${VERSION}-fpm-alpine

# PHP_CPPFLAGS are used by the docker-php-ext-* scripts
ENV PHP_CPPFLAGS="$PHP_CPPFLAGS"

# Install zip for csv stuff
# hadolint ignore=DL3018
RUN apk add --no-cache \
    libzip-dev \
    zip \
&& docker-php-ext-install zip \
&& apk del libzip-dev

# Install gd for image stuff
# hadolint ignore=DL3018
RUN apk add --no-cache libpng libpng-dev libjpeg-turbo-dev libwebp-dev zlib-dev libxpm-dev \
    && docker-php-ext-install gd \
    && apk del libpng-dev libjpeg-turbo-dev libwebp-dev zlib-dev libxpm-dev

# Install Nginx & PHP packages and extensions
# hadolint ignore=DL3018
RUN apk add --no-cache \
    # for PHP/Laravel
    git \
    icu-dev \
    msmtp \
    nginx \
    unzip \
    # zip \
    && mkdir -p /run/nginx \
    && docker-php-ext-install \
        pdo_mysql \
        opcache \
    && { \
        echo 'opcache.memory_consumption=128'; \
        echo 'opcache.interned_strings_buffer=8'; \
        echo 'opcache.max_accelerated_files=4000'; \
        echo 'opcache.revalidate_freq=2'; \
        echo 'opcache.fast_shutdown=1'; \
        echo 'opcache.enable_cli=1'; \
    } > /usr/local/etc/php/conf.d/php-opocache-cfg.ini \
    && apk del icu-dev

COPY /config/nginx.conf /etc/nginx/conf.d/default.conf
COPY /config/msmtprc /etc/msmtprc
COPY /scripts/start.sh /etc/start.sh
COPY --chown=www-data:www-data src/ /var/www/html

WORKDIR /var/www/html

EXPOSE 80 443

ENTRYPOINT ["/etc/start.sh"]

Dockerfile (project, references the Dockerfile above ^) Dockerfile(项目,引用上面的Dockerfile ^)

FROM justintime50/nginx-php:dev # the dockerfile above

COPY --chown=www-data:www-data ./src /var/www/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
RUN php composer.phar install -q --no-ansi --no-interaction --no-scripts --no-suggest --no-progress --prefer-dist \
    && chmod -R 775 storage \
    && php artisan storage:link \
    && chmod -R 775 bootstrap/cache

Docker Compose Docker 撰写

version: "3.7"
services:

    laraview:
        build: .
        restart: always
        container_name: laraview
        volumes: 
            - ./src/storage:/var/www/html/storage
        networks:
            - traefik
            - laraview
        labels:
            - traefik.enable=true
            - traefik.docker.network=traefik
            - traefik.frontend.rule=Host:laraview.localhost
            - traefik.port=80
        env_file:
            - init-db.env
        depends_on:
            - laraview-db

    laraview-db:
        image: mysql:8.0.18
        restart: always
        container_name: laraview-db
        env_file:
            - init-db.env
        volumes:
            - ./db:/var/lib/mysql
        networks:
            - laraview
        ports:
            - "3306:3306"
        labels:
            - traefik.enable=false

networks:
    traefik:
        external:
            name: traefik
    laraview:
        name: laraview

Upload Image File (Laravel)上传图片文件 (Laravel)

    public function updateProfilePic(Request $request)
    {
        $request->validate([
            'upload_profile_pic' => 'required|image|mimes:jpeg,jpg,png|max:2048',
        ]);
        $id = request()->get('id');

        $file = $request->file('upload_profile_pic');
        $img = Image::make($file)
            ->resize(320, 240)
            ->save(storage_path(), $file->getClientOriginalName());

        // Upload Profil Pic (IMAGE INTERVENTION - LARAVEL)
        //Image::make($request->file('upload_profile_pic'))->fit(150, 150)->save(storage_path('avatars/'.$id.'.png'));

        session()->flash("message", "Profile picture updated successfully.");
        return redirect()->back();
    }

References:参考:

@leo I apologize I never came back to answer this. @leo 我很抱歉我从来没有回来回答这个问题。 I don't remember the exact fix but I believe I was misusing storage_path .我不记得确切的修复方法,但我相信我滥用了storage_path Here is the corrected PHP code:这是更正后的 PHP 代码:

    public function uploadPostImage(Request $request)
    {
        $request->validate([
            'upload_image' => 'required|image|mimes:jpeg,jpg,png|max:2048',
        ]);
        $id = mt_rand(100000000000, 999999999999); # TODO: This is hacky, fix down the road

        if (!is_dir(storage_path("app/public/post-images"))) {
            mkdir(storage_path("app/public/post-images"), 0775, true);
        }

        // Upload Avatar (IMAGE INTERVENTION - LARAVEL)
        Image::make($request->file("upload_image"))->save(storage_path("app/public/post-images/".$id.".png"));

        session()->flash("message", "Image uploaded successfully.");
        return redirect()->back();
    }

I used the same Docker image and docker-compose file which means it must have been fixed by using storage_path correctly.我使用了相同的 Docker 镜像和 docker-compose 文件,这意味着它必须通过正确使用storage_path来修复。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM