php 为什么我在Laravel中仍然收到此文件上传错误?

oxosxuxt  于 2022-10-30  发布在  PHP
关注(0)|答案(1)|浏览(149)

我在一个Laravel项目中设置了一个文件上传系统。较小的文件可以正确上传,但是当我尝试上传较大的文件时,在生产服务器上出现以下错误:
upload_max_filesize
在查看了几个SO帖子等之后,我认为这个问题与php.ini文件中的upload_max_filesizepost_max_size值太小有关。
但是,upload_max_filesize被设置为5Mpost_max_size被设置为8M,我能够正确地重新启动Apache服务器,并且我确信(在服务器上运行PHP文件中的php_ini_loaded_filephp_ini_scanned_files函数后)所有这些设置都来自服务器上的/etc/php.ini文件。
即便如此,如果我尝试上传一个大约3.6 MB的文件,那么它会失败,并显示上面的错误消息。
是什么可能导致了这个问题,而我没有想到?谢谢。

Edit:下面是一些在服务器上重现错误的示例代码:

路线:

Route::get('/temp/upload-test', [TempController::class, 'uploadTest']);
Route::post('/temp/upload-test', [TempController::class, 'uploadFileTest']);

控制器:

public function uploadTest() {
    return view('uploadTest');
}

public function uploadFileTest() {
    $file = request()->file('file_0');

    if ($file) {
        $mimeType = $file->getMimeType(); // <-- This throws the error.

        return [
            'mimeType' => $mimeType
        ];
    }
}

uploadTest刀片文件:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
    </head>
    <body>
        <form>
            <input type="file">
            <input type="submit">
        </form>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/axios/1.1.3/axios.min.js">
        </script>
        <script>
            let file;

            const process = async (formData) => {
                const response = await axios.post('/temp/upload-test', formData, {
                    headers: {
                        'Content-Type': 'multipart/form-data'
                    }
                });

                console.log(response.data);
            };

            document.querySelector('input[type="file"]').addEventListener('change', (evt) => {
                if (evt.target.files[0]) {
                    file = evt.target.files[0];
                }
            });

            document.querySelector('form').addEventListener('submit', async (evt) => {
                if (file) {
                    let formData = new FormData();

                    formData.append(`file_0`, file);

                    process(formData);
                }

                evt.preventDefault();
            });
        </script>
    </body>
</html>

关键是我使用Axios将文件发送到服务器。这段代码正确地返回了本地主机设置中所有文件的MIME类型(无论大小),但似乎无法返回服务器上任何超过2 MB的文件,所以我假设这是服务器配置问题,但如前所述,php.ini文件似乎设置正确,我已经多次重新启动Apache。
下面是Laravel日志中错误的开始:

[timestamp] production.ERROR: The "" file does not exist or is not readable. {"exception":"[object] (Symfony\\Component\\Mime\\Exception\\InvalidArgumentException(code: 0): The \"\" file does not exist or is not readable. at /$
[stacktrace]

# 0 /var/www/sub-folder/vendor/symfony/mime/MimeTypes.php(134): Symfony\\Component\\Mime\\FileinfoMimeTypeGuesser->guessMimeType('')

# 1 /var/www/sub-folder/vendor/symfony/http-foundation/File/File.php(77): Symfony\\Component\\Mime\\MimeTypes->guessMimeType('')

# 2 /var/www/sub-folder/app/Http/Controllers/TempController.php(61): Symfony\\Component\\HttpFoundation\\File\\File->getMimeType()

# 3 /var/www/sub-folder/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\\Http\\Controllers\\TempController->uploadFileTest()

# 4 /var/www/sub-folder/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\\Routing\\Controller->callAction('uploadFileTest', Array)

编辑#2:我刚刚通过另一个测试确认了Axios不是问题所在。当我在没有任何JS的情况下提交标准表单时,我也遇到了同样的问题。

hwamh0ep

hwamh0ep1#

我终于找到了答案。我必须在重新启动Apache之前运行以下命令,以使php.ini文件的更改生效:
sudo systemctl restart php-fpm.service
在我运行了那个命令之后,***然后***重新启动了Apache服务器,一切都很好。

相关问题