2016-05-12 16 views
1

API/V1 /コントローラ/のREST APIでのファイルアップロードyii2

class ProfileController extends ActiveController 
{ 
public $modelClass = 'app\models\Profile'; 

public function behaviors() 
{ 
    return [ 
     [ 
      'class' => 'yii\filters\ContentNegotiator', 
      'only' => 
        ['index', 'view', 'createnew','update','search'], 
      'formats' => 
        ['application/json' => Response::FORMAT_JSON,], 

     ], 
     'verbs' => [ 
      'class' => VerbFilter::className(), 
      'actions' => [ 
       'index' => ['get'],    
       'view' => ['get'],    
       'createnew' => ['post'],  
       'update' => ['put'],   
       'delete' => ['delete'],   
       'deleteall' => ['post'], 
       'search' => ['get'] 
      ], 

     ] 
    ]; 
} 

public function actionCreatenew() { 
    $model = new Profile(); 
    $model->load(Yii::$app->request->post()); 



    $model->asset = UploadedFile::getInstance($model, 'asset'); 

    $name = $model->user_id; 

    if($model->asset) { 

     $model->asset->saveAs('uploads/'.$name.'. 
         '.$model->asset->extension); 
     $model->asset = $model->asset->name.'.'. 
         $model->asset->extension; 

    } 



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

}

内部の私のコントローラファイルIは次のようにポストマンからのアクセスこれを使用しよう: POST http://localhost/myapp/api/v1/profiles

I無効なパラメータを取得する - yii \ base \ InvalidParamException

応答内容は配列であってはなりません。

問題は何ですか?助けに感謝します!おかげ

+0

私はこの問題を私のapi/config.phpファイルに追加することで問題を解決しました。 '' '' enablePrettyUrl '=> true、' enableStrictParsing '=> true、' showScriptName '=> false、' rules ' => ['class' => 'yii \ rest \ UrlRule'、 'controller' => ['v1/country'、 'v1/profile']、 'extraPatterns' => ['POST createnew' => 'createnew '、]、]、]、]、' – Jackhad

答えて

0

は、あなたが簡単に直接Yii2コン​​トローラ/アクションでYii2でform-dataエンコーディングを持つHTTP POSTを使用して、単一/マルチアップロードされたファイルを、受け取ることができる代わりのgetInstance()チェックアウトこのLink

+0

ありがとうございました(上記のように追加されました)。しかし、私は "レスポンスの内容は配列であってはなりません。これについては私は信じていません。 – Jackhad

+1

どの行ですか?なぜあなたはjsonの文字列をエコーし​​ていますか?あなたは簡単に使用できます '' return ['status' => '成功'、 'データ' => $モデル - >属性]; " – mohit

+0

指定された行はhttp://imgur.com/riULw0Bです – Jackhad

2

\yii\web\UploadedFile::getInstanceByName('asset');を使用する必要があります。

使用このコード:

$uploads = UploadedFile::getInstancesByName("upfile"); 
    if (empty($uploads)){ 
     return "Must upload at least 1 file in upfile form-data POST"; 
    } 

    // $uploads now contains 1 or more UploadedFile instances 
    $savedfiles = []; 
    foreach ($uploads as $file){ 
     $path = //Generate your save file path here; 
     $file->saveAs($path); //Your uploaded file is saved, you can process it further from here 
    } 

あなたのAPIが動作しているかをテストするために郵便配達のAPIクライアントを使用する場合は、マルチファイルのアップロードのためにこのように動作するようにアップロードエンドポイントを設定することができます

Body form-data params for POST data request

注::角括弧は重要です!郵便配達員は、1つのスロットで複数のファイルをアップロードすることができますが、は実際にはになりません。スクリーンショットに示されているようにすると、UploadedFileメカニズムを介して、Yii2アクションで使用できる一連のファイルが作成されます。これは、標準のPHP $_FILES超大域変数とほぼ同じですが、扱いは簡単です。

[]の大括弧の有無にかかわらず、単一のファイルをアップロードすることができます。もちろん、あなたのコンベンションのために好きなものをupfileと名付けることもできます。

関連する問題