问题:“无法将图像数据写入路径” - Laravel 图像干预

无法将图像数据写入路径(Laravel)

我无法将任何内容保存到 Laravel 项目中的存储目录并收到以下错误:

无法将图像数据写入路径

在过去的三周里,我一直在试图找出为什么我无法将图像保存到Laravel中的Storage文件夹中,但没有运气。我搜索了 StackOverflow 并得出结论,这可能是由于我的 Docker 映像。如果可能的话,我很想使用我的自定义图像,但让它们正常工作。这是我的设置:

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(项目,参考上面的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 编写

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

上传图片文件(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();
    }

参考文献:

  • Nginx/PHP 镜像:https://github.com/Justintime50/nginx-php-docker/tree/develop

  • Laravel 项目:https://github.com/Justintime50/laraview/tree/develop

解答

@leo 我很抱歉我再也没有回来回答这个问题。我不记得确切的修复方法,但我相信我误用了storage_path。这是更正后的 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();
    }

我使用了相同的 Docker 映像和 docker-compose 文件,这意味着它必须已通过正确使用storage_path修复。

Logo

开发云社区提供前沿行业资讯和优质的学习知识,同时提供优质稳定、价格优惠的云主机、数据库、网络、云储存等云服务产品

更多推荐