【问题标题】:How to create a file upload REST API controller for Yii2如何为 Yii2 创建文件上传 REST API 控制器
【发布时间】:2016-08-27 04:00:25
【问题描述】:

我正在使用 Ionic 框架进行移动应用程序开发。下面的 Yii2 API 代码可以用于文件上传,但它不起作用。它显示以下错误:

i) 未定义的偏移量:0。

ii) yii\db\BaseActiveRecord->save()

public function actionNew() {
    $model = new Apiprofile();
    $userid = $_REQUEST['user_id'];
    $photo = $_FILES['photo'];
    $model->user_id = $userid;
    $model->photo = $photo;
    $name = $model->user_id;
    $model->file = UploadedFile::getInstance($model, 'photo');

    if($model->file) {
        $model->file->saveAs('uploads/photos/'.$name.'.'.$model->file->extension);
        $model->photo = $name.'.'.$model->file->extension;
        $model->save();
    }

    $name = $model->user_id;

    if($model->save()) {
        echo json_encode(array('status'=>1,'data'=>$model->attributes),JSON_PRETTY_PRINT);
    } else {
        echo json_encode(array('status'=>0,'error_code'=>400,'errors'=>$model->errors),JSON_PRETTY_PRINT);
    }
}

【问题讨论】:

  • 您能否提供完整的错误消息以及它显示的位置(可能是行号)?顺便说一句,你为什么要两次做同样的事情:这个$model->photo和这个$name和这个$model->save()
  • 首先感谢您的回复。是 $name 第二次不需要,bt 第一个 $model->save(),只保存照片,第二个检查其他字段是否保存,第一个模型->照片用于从用户获取输入,第二个模型->照片用于重命名文件并保存到数据库中。
  • "C:\\Projects\\htdocs\\basic12\\controllers\\ApiprofileController.php(67): yii\\db\\BaseActiveRecord->save()",.这是我们的 json 格式错误
  • Undefined offset: 0 尝试访问未设置的数组索引时发生错误。在访问它们之前检查$_REQUEST['user_id']$_FILES['photo']。您可以为此使用isset() 方法。看看是否有效

标签: php api ionic-framework yii2


【解决方案1】:

您好,如果您愿意,我将分享我用于在 Yii2 REST 中处理图像的帮助程序类。

在应用程序的基础文件夹中创建文件夹组件,并在该文件夹内创建两个文件夹助手和对象。

 -->assets
    -->componests
            ----->helpers
            ----->objects
    -->config
    -->...

然后在对象文件夹中创建类 FileUpload 并将此代码放入其中。

<?php
namespace app\components\objects;


class FileUpload
{
    public $error=[];
    public $isSuccess=false;
    public $file;
    public $ready_path;
    public $file_type;
    public $file_size;
    public $file_extension;
    public $file_tmp_name;

    public $file_name;
    public $save_path;

    public function __construct($file,$save_path,$ready_path,$required=false)
    {
        if(!isset($_FILES[$file])){
            if($required){
                $this->error=['message'=>$file.' is required'];
            }
            return $this;
        }
        $this->save_path=$save_path;
        $this->ready_path=$ready_path;
        $this->file_type = strtolower($_FILES[$file]['type']);
        $this->file_name = $_FILES[$file]['name'];
        $this->file_tmp_name=$_FILES[$file]['tmp_name'];
        $this->file_size = $_FILES[$file]['size'];
        $this->file_extension=pathinfo($this->file_name, PATHINFO_EXTENSION);
    }

    public function setError($error){
        if(empty($this->error)){
            $this->error=$error;
        }
    }

}

然后在 helpers 文件夹中创建类 FileUploadHelper,然后将这段代码放入其中。

<?php
namespace app\components\helpers;
use app\components\objects\FileUpload;
use Yii;

class  FileUploadHelper
{

    private $allowed_files;
    private $file_size;
    const IMAGE='image';
    const FILE='file';

    /** File Upload
     * @param string $file_name
     * @param string $save_path
     * @param string $ready_path
     * @param string $type
     * @param bool $required

     * @return \app\components\objects\FileUpload
     */
    public static function fileUpload($file_name,$save_path,$ready_path,$type,$required=false){

        $image=new FileUpload($file_name,$save_path,$ready_path,$required);
        if($type==self::FILE){
            $allowed_files=Yii::$app->params['allowed_files'];
            $file_size=Yii::$app->params['file_max_size'];
        }else{
            $allowed_files=Yii::$app->params['allowed_files'];
            $file_size=Yii::$app->params['file_max_size'];
        }
        $dir = realpath(Yii::$app->basePath);
        if(in_array($image->file_type,$allowed_files)
            &&$image->file_size<$file_size){
            $filename = $file_name.'_'.md5(uniqid(time()).time() . '_' . date('YmdHis')) . '.' . $image->file_extension;
            $file = $dir . $image->save_path . $filename;
            if(move_uploaded_file($image->file_tmp_name, $file)){
                $image->file=$image->ready_path. $filename;
                $image->isSuccess=true;
                $image->setError(['message'=>'file_upload_success']);
            }else{
                $image->setError(['message'=>'error_try_again']);
            }
        }else{
            $image->setError(['message'=>'file_should_be_no_more_than_given_size']);
        }
        return $image;
    }


    /** Delete File
     * @param string $ready_file
     */
    public static function deleteImage($ready_file){
        $dir = realpath(Yii::$app->basePath);
        if (strpos($ready_file, 'default') === false){
            if(is_file($dir.'/web/'.$ready_file)){
                unlink($dir.'/web/'.$ready_file);
            }
        }
    }
}

这一切都需要。下面我给大家举个例子

public function actionEditAvatar($id)
    {
        $product = Product::findOne($id);
        if( $product ){
                $old_avatar=$product->avatar;
                $image=FileUploadHelper::fileUpload(ProductForm::AVATAR,Yii::$app->params['product_path'],Yii::$app->params['product_ready_path'],FileUploadHelper::IMAGE);
                if($image->isSuccess) {
                    $product->avatar = $image->file;
                    if($product->save()){
                        FileUploadHelper::deleteImage($old_avatar);
                        return $product->avatar;
                    }

                }
            return $image->error;
        }
        throw new NotFoundHttpException;
    }

上面的代码来自一个真实的项目。 FileUploadHelper 有两个静态类,分别是“fileUpload”和“deleteImage”。 FileUploadHelper 需要 fileUpload('file_name','save_path','ready_path','type') 'save_path' 是保存文件的位置。 'ready_path' 是准备好的 URL 应该是什么样的。 它们在 Yii::$app->params[];

您可以通过属性isSuccess检查图像是否成功。如果您有错误,您可以通过属性错误访问它们。准备好的文件可以通过属性文件访问。您可以通过静态函数 deleteImage('saved_image_url'); 删除图像它们都用于上述动作。请看。 顺便说一下,这里是我使用的参数。不要忘记在 web/uploads 中创建文件夹,并像在配置文件中一样更改文件夹的名称。

return [
    'adminEmail' => 'admin@example.com',

    'allowed_images'                   => [ 'image/jpeg', 'image/gif', 'image/png' ],
    'allowed_files'                    => [ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document','application/msword', 'application/pdf','image/jpeg', 'image/gif', 'image/png'],

    'image_max_size'                   => 2097152,
    'file_max_size'                    => 8388608,

    'owner_document_path'              => '/web/uploads/owner_document/',
    'owner_document_ready_path'        => 'uploads/owner_document/',

    'product_path'                     => '/web/uploads/product/',
    'product_ready_path'               => 'uploads/product/',

    'complain_photo_path'              => '/web/uploads/complain_photo/',
    'complain_photo_ready_path'        => 'uploads/complain_photo/',

    'owner_path'                       => '/web/uploads/owner/',
    'owner_ready_path'                 => 'uploads/owner/',


    'staff_path'                       => '/web/uploads/staff/',
    'staff_ready_path'                 => 'uploads/staff/',
];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    相关资源
    最近更新 更多