2016-05-02 2 views
4

Я использую Ionic framework для разработки мобильных приложений. Код Yii2 API ниже можно использовать для загрузки файлов, но он не работает. Он показывает следующие ошибки:Как создать файл для загрузки REST API-контроллер для Yii2

я) Undefined смещение: 0.

б) юй \ дб \ BaseActiveRecord-> сохранить()

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); 
    } 
} 
+0

Вы можете предоставить полное сообщение об ошибке, а также где (номер строки может быть) он отображается? и btw, почему вы делаете то же самое дважды: это '$ model-> photo' и это' $ name' и this '$ model-> save()'! – leninhasda

+0

Сначала спасибо за ваш ответ. Да $ name не требуется во второй раз, bt first $ model-> save(), сохранить только фотографию, второй проверить другие поля, сохранить или нет, а первая модель-> фотография, используемая для ввода ввода от пользователя, а вторая модель-> фото используется для переименования файла и сохранения в db. –

+0

"C: \\ Проекты \\ htdocs \\ basic12 \\ контроллеры \\ ApiprofileController.php (67): yii \\ db \\ BaseActiveRecord-> save()" ,. это наша ошибка формата json –

ответ

0

Привет, если вы хотите, я буду поделиться моим вспомогательным классом, который я использовал для работы с изображениями в 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; 
     } 
    } 

} 

Затем внутри папки помощников создайте класс 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 ('имя_файла', 'save_path', 'ready_path', 'type') «save_path» - это файл, в котором будет сохранен файл. «ready_path» - как должен выглядеть готовый URL. они находятся в Yii :: $ app-> params [];

Вы можете проверить, было ли изображение успешным или нет атрибутом isSuccess. Если у вас есть ошибка, вы можете получить к ним доступ по ошибке атрибута. Доступ к готовому файлу возможен через файл атрибута. Вы можете удалить изображение с помощью статической функции deleteImage ('saved_image_url'); Все они используются при вышеуказанном действии. Пожалуйста, смотрите. Кстати, здесь параметры, которые я использовал. Не забудьте создать папки внутри web/uploads и изменить имена папок, как в файле конфигурации.

return [ 
    'adminEmail' => '[email protected]', 

    '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/', 
];