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
相关产品推荐
相关产品推荐

