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

Yii2控制器中sendFile返回0字节文件,原因是什么?

文件下载返回空内容(0字节)问题排查

控制器代码

public function actionGetFile($id)
{
    if(($file = Upload::findOne(['id' => $id])) !== NULL){
        // Yii::$app->response->headers->set('Content-Type',$file->mime_type);
        // Yii::$app->response->headers->set('Content-Description','File Transfer');
        // Yii::$app->response->headers->set('Content-Transfer-Encoding', 'binary');
        // Yii::$app->response->headers->set('Accept-Ranges', ['bytes']);
        Yii::$app->response->sendFile(
            Site::UPLOADS_DOMAIN . '/' . $file->getFilePath(false),
            $file->original_name . "." . $file->original_extension,
            ['mimeType'=>$file->mime_type, 'inline'=>false]
        );
    }
    else
        throw new NotFoundHttpException('The selected file does not exist.');
}

问题描述

通过GET请求访问URL:/controller-name/get-file?id=n时,返回的文件名称正确,但文件内容为空(0字节),请问这是什么原因?

可能的原因及解决方法

  • 未返回响应对象:sendFile方法需要通过return返回才能让Yii正确处理响应。当前代码仅调用方法但未返回,导致响应未被正确输出。修改代码为:
    return Yii::$app->response->sendFile(
        Site::UPLOADS_DOMAIN . '/' . $file->getFilePath(false),
        $file->original_name . "." . $file->original_extension,
        ['mimeType'=>$file->mime_type, 'inline'=>false]
    );
    
  • 文件路径为远程地址:sendFile仅支持读取本地服务器的文件路径。如果Site::UPLOADS_DOMAIN是http://或https://开头的远程域名,Yii无法直接读取远程文件内容,会返回空文件。需要改为文件的本地绝对路径,或者先将远程文件下载到本地临时目录再返回。
  • 服务器上文件实际不存在:虽然Upload模型查询到了记录,但对应路径的文件可能已被删除或移动。打印完整路径Site::UPLOADS_DOMAIN . '/' . $file->getFilePath(false),直接到服务器上验证文件是否存在。
  • 文件权限不足:运行PHP的服务器进程(如php-fpm、apache)没有读取该文件的权限。检查文件及所在目录的权限设置,确保进程用户拥有读权限(通常设置为644,目录为755)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:25:14