You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

排查与解决方向

  1. 服务器文件权限检查

    • 检查storage/app/tmp目录及子目录的权限,确保Apache运行用户(通常为www-data)拥有读写权限
    • 执行命令:sudo chown -R www-data:www-data storage/app/tmp、sudo chmod -R 755 storage/app/tmp
  2. PHP上传限制配置

    • 检查服务器php.ini文件,确认以下参数设置足够:
      • upload_max_filesize:建议设为大于MP3文件大小的值,如10M
      • post_max_size:需大于upload_max_filesize,如12M
      • max_execution_time:确保大文件上传有足够执行时间,如300
    • 修改后重启Apache:sudo systemctl restart apache2
  3. 文件上传验证与错误捕获

    • 在Uploader的upload方法中添加文件有效性检查:
      if (!$this->file->isValid()) {
          throw new \Exception('文件上传无效:' . $this->file->getErrorMessage());
      }
      
    • 查看Laravel日志(storage/logs/laravel.log),提取上传相关错误信息
  4. Apache模块与配置检查

    • 确认Apache已启用mod_mime模块:执行apache2ctl -M | grep mime,未启用则执行sudo a2enmod mime并重启Apache
    • 检查服务器级MIME配置(/etc/apache2/mods-available/mime.conf),确保已添加audio/mpeg .mp3
  5. 文件系统路径验证

    • 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());
      

内容的提问来源于stack exchange,提问作者Rayan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 01:20:33