Reputation: 719
I'm not able to save anything to the storage directory in a Laravel project and receive the following error:
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. I've scoured StackOverflow and have come to the conclusion that it's probably due to my Docker image. 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();
}
Upvotes: 1
Views: 4484
Reputation: 719
@leo I apologize I never came back to answer this. I don't remember the exact fix but I believe I was misusing storage_path
. Here is the corrected PHP code:
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.
Upvotes: 3