🤖

[deploy] nuxt/laravel 画像・音声をs3へアップロード

2021/10/17に公開

s3へのアップロードで、以下エラーが発生

The file \"test1.mp3\" does not exist

わかってること

  • src/storage/app/public/images配下には保存できている
    • サイズの問題ではない?
      該当コード
      src/app/Http/Controllers/MusicFileController.php
    public function musicFileUpload(Request $request)
    {
        $music_file = new MusicFile;

        // リクエストされてきたmusic_fileにファイル名をつけて保存
        // 元々ついていたファイル名を保存するファイル名に設定
        $file_name = $request->file('music_file')->getClientOriginalName();
        // public/mp3files配下に保存
        // $include_public = Storage::putFileAs('public/mp3files', $request->file('music_file'), $file_name);
        // public/部分をカット
        // $music_file->music_file = str_replace('public/', '', $include_public);
        $music_file->music_file = Storage::disk('s3')->putFile('/', $file_name, 'public');
        
        // リクエストされてきたcover_imagにファイル名をつけて保存
        // 元々ついていたファイル名を保存するファイル名に設定
        $file_name = $request->file('cover_image')->getClientOriginalName();
        // public/images配下に保存
        // $include_public = Storage::putFileAs('public/images', $request->file('cover_image'), $file_name);
        // public/部分をカット
        // $music_file->cover_image = str_replace('public/', '', $include_public);
        $music_file->cover_image = Storage::disk('s3')->putFile('/', $file_name, 'public');

        $music_file->title = $request->title;
        $music_file->genre = $request->genre;
        $music_file->emotions = $request->emotions;
        $music_file->user_id = $request->user_id;
        $music_file->user_name = $request->user_name;
        $music_file->save();
    }

やったこと

10/15

upload_max_filesize、post_max_sizeを200Mにする

docker/php/php.ini

zend.exception_ignore_args = off
expose_php = on
max_execution_time = 30
max_input_vars = 1000
upload_max_filesize = 200M //64→200にあげる
post_max_size = 200M //128→200にあげる
error_reporting = E_ALL
display_errors = on
display_startup_errors = on
log_errors = on
error_log = /dev/stderr
default_charset = UTF-8
[Date]
date.timezone = Asia/Tokyo
[mysqlnd]
mysqlnd.collect_memory_statistics = on
[Assertion]
zend.assertions = 1
[mbstring]
mbstring.language = Japanese

https://kang.hateblo.jp/entry/2020/05/07/155835

キャッシュクリア

# php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
Application cache cleared!
# Configuration cache cleared!
# Route cache cleared!
# Compiled views cleared!

https://qiita.com/Ping/items/10ada8d069e13d729701

10/16

client_max_body_sizeを200Mにする

docker/web/default.conf

server {
    listen 80;
    root  /var/www/html/src/public;
    index index.php index.html index.htm;
    index index.html;
    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;
    # add_header Access-Control-Allow-Origin *;
    # add_header Access-Control-Allow-Methods "POST, GET, OPTIONS";
    # add_header Access-Control-Allow-Headers "Origin, Authorization, Accept";
    # add_header Access-Control-Allow-Headers "X-Requested-With, Origin, X-Csrftoken, Content-Type, Accept";
    # add_header Access-Control-Allow-Credentials true;
    client_max_body_size 200M; //20→200にあげる
    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

キャッシュクリア

dockerコンテナ上げ下げ

docker system prune
docker-compose build --no-cache
docker-compose up

s3に直接アップロードしたところ問題なくアップロードできた

laravelもしくはサーバー側の問題ではありそう

呼び出されているFile.phpのline36を確認

src/vendor/symfony/http-foundation/File/File.php

    public function __construct(string $path, bool $checkPath = true)
    {
        if ($checkPath && !is_file($path)) {
            throw new FileNotFoundException($path); //line36
        }

        parent::__construct($path);
    }

いったんアップロードはできた

MusicFileController.php変更をしたところ
src/app/Http/Controllers/MusicFileController.php

    public function musicFileUpload(Request $request)
    {
        $music_file = new MusicFile;

        // リクエストされてきたmusic_fileにファイル名をつけて保存
        // 元々ついていたファイル名を保存するファイル名に設定
        $file_name = $request->file('music_file')->getClientOriginalName();
        // public/mp3files配下に保存
        // $include_public = Storage::putFileAs('public/mp3files', $request->file('music_file'), $file_name);
        // public/部分をカット
        // $music_file->music_file = str_replace('public/', '', $include_public);
        $music_file->music_file = Storage::disk('s3')->putFile('/', $request->file('music_file'), 'public');
        
        // リクエストされてきたcover_imagにファイル名をつけて保存
        // 元々ついていたファイル名を保存するファイル名に設定
        $file_name = $request->file('cover_image')->getClientOriginalName();
        // public/images配下に保存
        // $include_public = Storage::putFileAs('public/images', $request->file('cover_image'), $file_name);
        // public/部分をカット
        // $music_file->cover_image = str_replace('public/', '', $include_public);
        $music_file->cover_image = Storage::disk('s3')->putFile('/', $request->file('music_file'), 'public');

        $music_file->title = $request->title;
        $music_file->genre = $request->genre;
        $music_file->emotions = $request->emotions;
        $music_file->user_id = $request->user_id;
        $music_file->user_name = $request->user_name;
        $music_file->save();
    }

エラーがいかに変わった

Error executing "PutObject" on "https...

解決

下記記事の方法でs3の設定を変えたらいけた
https://qiita.com/whitia/items/271ce8485df2148702df

Discussion