[英]"Can't write image data to path" - Laravel Image Intervention
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.在过去的三个星期里,我一直在试图找出为什么我无法将图像保存到
Laravel
的Storage
文件夹中。 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:
这是我的设置:
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"]
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
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
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();
}
@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.