使用Yii::app()下载->request->SendFile返回损坏的文件

klh5stk1  于 2022-11-09  发布在  其他
关注(0)|答案(4)|浏览(338)

我一直在尝试从如下特定目录下载上传的文件:

Yii::app()->request->SendFile($model->statement, 
                        file_get_contents($path.$model->statement)
                        );

它识别文件,并下载了正确的名称和格式,但所有我得到的而不是一个74 KB的文件,是一个1 KB损坏的文件。尝试了其他文档,如.doc,.pdf,仍然一样。
我并不完全确定file_get_contents实际上做了什么,因为我从我找到的一个例子中得到了这个。
要下载的文件以前是使用

<div class="row">
    <?php echo $form->labelEx($model, 'statement'); ?>
    <?php echo $form->fileField($model, 'statement', array('size' => 36, 'maxlength' => 255)); ?>
    <?php echo $form->error($model, 'statement'); ?>
</div>

在_form. php中,并调整了控制器中的actionCreate:

public function actionCreate($id)
{
    $model=new Witness;
    $model->ip_id = $id;

    // Uncomment the following line if AJAX validation is needed
    // $this->performAjaxValidation($model);

    $path = Yii::app()->basePath . '/modules/iris/statements';
    if (!is_dir($path)) {
        mkdir($path);
    }   

    if(isset($_POST['Witness']))
    {
        $model->attributes=$_POST['Witness'];

        if (@!empty($_FILES['Witness']['name']['statement'])) {
            $model->statement = $_POST['Witness']['statement'];
            if ($model->validate(array('statement'))) {
                $model->statement = CUploadedFile::getInstance($model, 'statement');
            } else {
                $model->statement = '';
            }

            $model->statement->saveAs($path . '/' . time() . '_' . str_replace(' ', '_', strtolower($model->statement)));

            //$model->doc_type = $model->statement->getType();
            //$model->doc_size = $model->statement->getSize();
        }

        $model->statement = time() . '_' . str_replace(' ', '_', strtolower($model->statement));

        if($model->save())
            $this->redirect(array('ip/view','id'=>$model->ip_id));
    }

    $this->render('create',array(
        'model'=>$model,
    ));
}

上传的文件可以打开没有问题。你知道为什么下载损坏了吗?我必须在下载前先指定文件的类型/大小吗?

vxqlmq5t

vxqlmq5t1#

对于一个1kb的文件,听起来像是你的服务器在设置了头文件后抛出了一个php错误。
使用文本编辑器打开下载的文件并检查内容。

mum43rcc

mum43rcc2#

我找到了另一个解决方案,而不是使用SendFile函数。将其放在视图文件中以生成下载链接:

CHtml::link('Click to download file', array('ip/download&id='.$model->file_id));

其中“ip”是模型名称。这将把file_id传递给控制器中创建的函数actionDownload。php:

public function downloadFile($fullpath){
    if(!empty($fullpath)){
        header("Content-type:application/pdf"); //for pdf file
        //header('Content-Type:text/plain; charset=ISO-8859-15');
        //if you want to read text file using text/plain header
        header('Content-Disposition: attachment; filename="'.basename($fullpath).'"');
        header('Content-Length: ' . filesize($fullpath));
        readfile($fullpath);
        Yii::app()->end();
    }
}

public function actionDownload($id){
    $model=Ip::model()->findByPk($id);
    $path = Yii::app()->basePath . 'location of file to be downloaded'.$model->filename;
    $this->downloadFile($path);
}

这应该下载文件完全。不要担心的内容类型,我已经尝试了所有常见的文件类型(.pdf,.doc,.ppt,.png,.jpg),所有的工作完美。

swvgeqrz

swvgeqrz3#

在Yii2中,sendFile()签名是

public $this sendFile ( $filePath, $attachmentName = null, $options = [] )

发送文件:

Yii::$app->response->sendFile('test.zip');

对于那些获得完整文件但仍损坏的用户:
你应该检查是否有其他的php文件在打印输出,有时候PHP标签后面的空格会导致问题。
从这里

ljsrvy3e

ljsrvy3e4#

如果您查看sendFile的参数列表,您可以看到第三个参数是mimeType。实际上,您没有提供HTTP头响应,所以我的首要建议是尝试显式指定Content-Type响应头:

Yii::app()->request->sendFile(
   "Youfile.pdf",
   file_get_contents('path/to/file'), 
   'application/pdf'
);

相关问题