Laravel 9上传MP3至Ubuntu Apache服务器后文件大小为0
Laravel 9 MP3上传异常排查(本地正常,Ubuntu+Apache服务器上传后文件大小为0)
问题现象
- 本地Windows+XAMPP环境下,MP3文件上传无异常,图片及其他音频类型上传正常
- 部署至Linux Ubuntu+Apache服务器后,MP3上传后文件大小变为0
- 已在public目录的.htaccess中添加MP3的MIME类型支持,但问题未解决
相关代码
public目录下的.htaccess文件
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # Handle Authorization Header RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # Send Requests To Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule> # Video support AddType video/ogg .ogv AddType video/mp4 .mp4 AddType video/webm .webm AddType video/ogv .ogv # Audio support AddType audio/mp3 .mp3 AddType audio/mpeg .mp3 AddType audio/oga .oga AddType audio/ogg .ogg AddType audio/wav .wav # For HLS support AddType application/x-mpegURL .m3u8 AddType vnd.apple.mpegURL .m3u8 AddType video/MP2T .ts # For M(PEG)-DASH support AddType application/dash+xml .mpd # For subtitles support AddType text/vtt .vtt AddType text/srt .srt
UploadController代码
class UploadController extends Controller { public function __construct(private Uploader $uploader) { } public function store(StoreRequest $request) { return $this->uploader->upload(); } }
Uploader类代码
class Uploader { private $file; public function __construct(private Request $request) { $this->file = $this->request->file; } public function upload() { DB::beginTransaction(); try { $folderName = $this->getFolderName(); $this->saveFileIntoDatabase($folderName); $this->putFileIntoStorage($folderName); DB::commit(); return $folderName; } catch (\Exception $e) { DB::rollBack(); return ''; } } private function saveFileIntoDatabase(string $folderName) { return TemporaryFile::create([ 'folder' => $folderName, 'file_name' => $this->getFileName() ]); } private function getFolderName() { return uniqid() . '-' . now()->timestamp; } private function getFileName() { return $this->file->getClientOriginalName(); } private function putFileIntoStorage(string $folderName) { return $this->file->storeAs(config('filesystems.temporary_file_path') . $folderName,$this->getFileName()); } }
filesystems.php配置
'temporary_file_path' => 'tmp' . DIRECTORY_SEPARATOR
排查与解决方向
服务器文件权限检查
- 检查
storage/app/tmp目录及子目录的权限,确保Apache运行用户(通常为www-data)拥有读写权限 - 执行命令:
sudo chown -R www-data:www-data storage/app/tmp、sudo chmod -R 755 storage/app/tmp
- 检查
PHP上传限制配置
- 检查服务器
php.ini文件,确认以下参数设置足够:upload_max_filesize:建议设为大于MP3文件大小的值,如10Mpost_max_size:需大于upload_max_filesize,如12Mmax_execution_time:确保大文件上传有足够执行时间,如300
- 修改后重启Apache:
sudo systemctl restart apache2
- 检查服务器
文件上传验证与错误捕获
- 在Uploader的
upload方法中添加文件有效性检查:if (!$this->file->isValid()) { throw new \Exception('文件上传无效:' . $this->file->getErrorMessage()); } - 查看Laravel日志(
storage/logs/laravel.log),提取上传相关错误信息
- 在Uploader的
Apache模块与配置检查
- 确认Apache已启用
mod_mime模块:执行apache2ctl -M | grep mime,未启用则执行sudo a2enmod mime并重启Apache - 检查服务器级MIME配置(
/etc/apache2/mods-available/mime.conf),确保已添加audio/mpeg .mp3
- 确认Apache已启用
文件系统路径验证
- Linux下
DIRECTORY_SEPARATOR为/,配置生成的路径为tmp/,最终存储路径为storage/app/tmp/[folderName]/[filename],可在putFileIntoStorage方法中打印路径验证:$fullPath = config('filesystems.temporary_file_path') . $folderName . '/' . $this->getFileName(); \Log::info('文件存储路径:' . $fullPath); return $this->file->storeAs(config('filesystems.temporary_file_path') . $folderName,$this->getFileName());
- Linux下
内容的提问来源于stack exchange,提问作者Rayan
相关产品推荐
相关产品推荐

