Загрузить изображение и текст с Angular6-Yii2 - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь создать форму с вводом текста и вводом файла загрузки, используя Angular6 для стороны клиента и Yii2 для стороны сервера.

Угловой сервис:

create(name: string, image: any): Observable<any> {
  let url = this.baseUrl + 'create';
  let form: FormData = new FormData();
  form.append('image', image);
  form.append('name', name);
  return this.http.post<Notification>(url, form);
}

Контроллер Yii:

public function beforeAction($action) 
{ 
    $this->enableCsrfValidation = false;
    return parent::beforeAction($action); 
}

public function actionCreate()
{
    $model = new MapCreationFormModel();
    if ($model->load(Yii::$app->request->post()))
    {
        $model->image = UploadedFile::getInstance($model, 'image');         
        $response = MapRepository::create($model->name, $model->image);
        return json_encode($response);
    }
    else
    {
        // >>> This exception is thrown.
        throw new Exception("Cannot bind model");
    }
}

Модель Yii:

class MapCreationFormModel extends Model
{
    public $name;
    public $image;
}

Используя fiddler, я вижу свой запрос:

------ WebKitFormBoundaryIv0dYBA9ZKwRHXlu Content-Disposition: form-data; Name = "изображение"; filename = "test.bmp" Content-Type: image / bmp

BM [[[SPECIAL CHARACTERS]]]

------ WebKitFormBoundaryIv0dYBA9ZKwRHXlu Content-Disposition: form-data; имя = "имя"

аа

------ WebKitFormBoundaryIv0dYBA9ZKwRHXlu -

К сожалению, исключение «Исключение (« Невозможно связать модель »)» из моего контроллера выброшено (см. Код контроллера).

У вас есть идеи, почему моя модель не может быть связана?

1 Ответ

1 голос
/ 08 июля 2019

Я наконец нашел свою проблему с этим сообщением: Изображение Yii2 POST для моделирования в API без соглашения об именах Yii2 .

Я должен использовать метод UploadedFile::getInstanceByName.

Вот мой код для заинтересованных людей:

public function actionCreate()
{
    $name = Yii::$app->request->post('name'); 
    $fileData = UploadedFile::getInstanceByName('image');
    $fileName = time() . '.' . $fileData->extension;
    $filePath = '../uploads/' . $fileName;
    $fileData->saveAs($filePath);
    $image = fopen($filePath,"rb");
    // Do your stuff.
}
...