2019-01-30 16:57:40 192次浏览 2条回答 0 悬赏 50 金钱

一个上传文件的表单,只有一个上传文件的 input 的时候,一切正常,文件也可以正常上传,但是一旦加上一个 text input 用于输入文字,就无法正常工作了,打开debug 看,request body 是空的,但是$_post 和 $_file 都是有内容的,想请教下是怎么回事?应该怎么解决,先谢谢了。

亿速云
  • 回答于 2019-01-31 14:25 举报

    能把代码放出来吗?

    1 条回复
    回复于 2019-02-01 16:55 回复

    感谢你的关注,提前祝你春节愉快^_^
    下面是我学写的代码,如果有时间麻烦替我看下,先谢谢了。
    File :UploadfilesForm.php

    ...
    class UploadfilesForm extends Model
    {

    public $videoFile;
    public $videoName;
    public $videoCategory;
    public $videoCover;
    
    public function rules(){
        return [
            [['videoFile'],'file', 'extensions'=>['jpg','mp4','rmvb']],
            [['videoName'],'required'],
            //[['videoCategory'],'required'],
            //[['videoCover'],'file','extensions'=>['jpg','png','gif']]
        ];
    }//rules()
    
    public function upload(){
    
            $strUrl = '/video/' . $this->videoFile->baseName . '.' . $this->videoFile->extension;
    
        if($this->validate()){
            $this->videoFile->saveAs($strUrl);
            return TRUE;
        }
        else{
            return FALSE;
        }
    }//upload()
    
    

    }//class UploadfilesForm extends Model

    File : UploadfilesController.php
    ...
    class UploadfilesController extends Controller
    {

    public function actionUpload(){
        //$enableCsrfValidation = FALSE;
        $model = new UploadfilesForm();
        
        if(Yii::$app->request->isPost){
            $model->videoFile = UploadedFile::getInstance($model, 'videoFile');
            if($model->upload()){
                echo '文件上传成功'; 
                return exit('文件上传成功');
            }
        }//if(Yii::$app->request->isPost)
        return $this->render('uploadvideos',['model'=>$model]);
    }//public function actionUpload()
    

    }//class UploadfilesController extends Controller

    File : uploadvideos.php
    <?php
    use yii\widgets\ActiveForm;

    ?>

    <?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?>

    <?php echo $form->field($model, 'videoName')->textInput()->hint('请输入电影名称(不是文件名),不要包含扩展名。')->label('电影名称:'); ?>
    <?php //echo $form->field($model, 'videoCategory')->dropDownList(['dzp'=>'动作片','jqp'=>'剧情片','znl'=>'正能量'], ['prompt'=>'请选择','style'=>'width:120px'])->label('请选择影视类型'); ?>
    
    
    
    
    <?php echo $form->field($model, 'videoFile')->fileInput()->hint('请注意:仅支持扩展名为 mp4 的影视文件。')->label('影视文件:'); ?>
    <?php //echo $form->field($model, 'videoCover')->fileInput()->hint('请选择海报文件。')->label('影视海报:'); ?>
    
    <button>上传影视</button>
    

    <?php ActiveForm::end() ?>

    <p><hr></p>
    
  • 回答于 2019-02-05 23:08 举报

    这个问题,困扰我好久了,借着过年,用了两天好好研究了一下,终于搞明白了。
    以下是我研究过程中写的备忘录,写作水平太水,你可以借鉴一下。

    ???上传文件时,调用saveAs()方法,传入的路径中,使用$model->photo->name,报错failed to open stream。
    经过研究发现:文件名为中文,改成英文或数字都正常上传。待研究处理。
    经过一天研究:此问题原因为编码引发的“血案”,windows默认编码为GBK(查看方法:开始->cmd->chcp,然后显示一个数字:如936,则代表是GBK简体中文),Linux 系统本身就是使用 UTF-8 来编码的,yii2.0编码格式为utf-8。
    在上传文件后,一般都会用 move_uploaded_file() 进行文件移动改名。但是 move_uploaded_file() 并不支持 UTF-8 编码,如果含有,那么函数就会执行失败,但是这个函数是支持 GB2312 或者是 GBK 编码的,在调用move_uploaded_file()方法前,通过mb_convert_encoding ( string $str , string 转换后,string 转换前),在存入数据库时,使用此函数转化为utf-8保存。

您需要登录后才可以回答。登录 | 立即注册
sk811229
见习主管

sk811229

注册时间:2018-05-23
最后登录:2019-02-03
在线时长:8小时40分
  • 粉丝0
  • 金钱315
  • 威望0
  • 积分395

热门问题