2016-12-19 1 views
0

Я создаю конечную точку для мобильного приложения для отправки изображения на сервер. Я отправляю изображение с расширением POSTMAN для хром. Изображение находится в переменной $_FILES и называется image. Как загрузить это изображение в модель или класс UploadedFile? Строка $model->load(Yii::$app->request->post()) неправильно загружает файл, так как это не относится к именованию Yii2 для форм.Yii2 POST изображение для модели в API без Yii2 Соглашение об именовании

Это в настоящее время возвращения:

{ 
    "success": false, 
    "message": "Required parameter 'image' is not set." 
} 

Код

модели \ image.php

<?php 
namespace api\modules\v1\models; 

use yii\base\Model; 
use yii\web\UploadedFile; 

class Image extends Model 
{ 
    /** 
    * @var UploadedFile 
    */ 
    public $image; 

    public function rules() 
    { 
     return [ 
      [['image'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg'], 
     ]; 
    } 

    public function upload() 
    { 
     $path = dirname(dirname(__FILE__)) . '/temp/'; 
     if ($this->validate()) { 
      $this->image->saveAs($path . $this->image->baseName . '.' . $this->image->extension); 
      return true; 
     } else { 
      die(var_dump($this->errors)); 
      return false; 
     } 
    } 
} 

контроллеры \ DefaultController.php

<?php 
namespace api\modules\v1\controllers; 

use api\modules\v1\models\Image; 
use yii\web\Controller; 
use yii\web\UploadedFile; 
use Yii; 

class DefaultController extends Controller 
{ 
    public $enableCsrfValidation = false; 

    public function actionIndex() 
    { 
     Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; 

     $model = new Image(); 

     if (Yii::$app->request->isPost) { 
      if($model->load(Yii::$app->request->post())) 
      { 
       $model->image = UploadedFile::getInstance($model, 'image'); 
       if ($model->upload()) { 
        // file is uploaded successfully 
        return ['success' => true, 'message' => 'File saved.']; 
       } 
       else return ['success' => false, 'message' => 'Could not save file.']; 
      } 
      else return ['success' => false, 'message' => 'Required parameter \'image\' is not set.']; 
     } 
     else return ['success' => false, 'message' => 'Not a POST request.']; 
    } 
} 

Почтальон Postman POST request

ответ

0

Ваша проблема, как представляется, имя, которое вы используете для отправки файла изображения. Обычно Yii2 использует имена формы атрибуты, как «ModelName [ATTRIBUTENAME]» и вы отправляете файл изображения с именем «образ»

Есть 2 способа фиксации этого:

  1. Изменить имя, которое вы используете чтобы отправить файл изображения, чтобы выполнить тот же порядок именования. Однако, похоже, вы этого не хотите.
  2. Используйте getInstanceByName('image') метод вместо getInstance($model, 'image')
+0

Функции, указанные Вами в пункте 2 был именно то, что я был после. Спасибо. –

0

Проблема приходят сюда При отправке файлов через API они не отправленного асинхронно. Если вы проверяете

echo '<pre>'; 
print_r($_FILES); //returns nothing 
print_r($_POST["image"]); //returns something 
echo '</pre>'; 
die; 

Одной из причин является то, что ваш контроллер расширяет yii\web\controller, который не используется APIs отдыха, расширить yii\rest\controller

Другой путь, о это с помощью яваскрипта FormData при отправке запроса на почту

Это путь я обработал предыдущий пост АЯКС изображения, вероятно Итл дать вам ориентир

The form 
<?php $form = ActiveForm::begin(['options' => ['enctype' => 
    'multipart/form-data','id'=>'slider_form']]); ?> //dont forget enctype 

<?= $form->field($model, 'file')->fileInput() ?> 

Тогда на АЯКСЕ поста

var formData = new FormData($('form#slider_form')[0].files); 

$.post(
    href, //serialize Yii2 form 
    {other atributes ,formData:formData} 
) 

Then on the controller simply access via 
$model->file =$_FILES["TblSlider"]; //here this depends on your form attributes check with var_dump($_FILES) 
$file_tmp = $_FILES["TblSlider"]["tmp_name"]["file"]; 
     $file_ext = pathinfo($_FILES['TblSlider']['name']["file"], PATHINFO_EXTENSION); 

     if(!empty($model->file)){ 

      $filename = strtotime(date("Y-m-d h:m:s")).".".$file_ext; 

      move_uploaded_file($file_tmp, "../uploads/siteimages/slider/".$filename); 
      ///move_uploaded_file($file_tmp, Yii::getAlias("@uploads/siteimages/slider/").$filename); 
      $model->image = $filename; 
     } 

Я надеюсь, что это помогает

Смежные вопросы