2017-04-21 14 views
0

クライアント側でAngularJSを使用して、サーバー側のコントローラにフォームを送信しています。ファイルを含むフォームをFOSRestBundleコントローラに送信する方法

ファイルをアプリケーションに格納しているため、ユーザーがファイルに関するメタデータを提供しているため、ワークフローを小さなタスクに分割することはできません。

私はAngularの$ httpサービスでリクエスト変換を使用して投稿データを作成しました。 Webサービスクライアントの現在の状態:

function _save(dataModel, formfile) 
{ 
    $http({ 
     url : basePath + (dataModel.id ? ("/" + dataModel.id) : ""), 
     method : "POST", 
     headers : { 
      'Content-Type' : undefined 
     }, 
     transformRequest : function(data) 
     { 
      var formData = new FormData(); 
      formData.append("dto", angular.toJson(data.model)); 
      formData.append("file", data.file); 
      return formData; 
     }, 
     data : { 
      model : dataModel, 
      file : formfile 
     } 
    }).then(function(response) 
    { 
    }); 
} 

は、残念ながら、私はこの応答を取得:

415サポートされていないメディアタイプ

私はのどのコンポーネントを決定することができていませんSymfonyスタックはその返答を提供し、multipart/form-dataを参照するのか、ファイルに添付されているContent-Type: application/octet-streamの指定を参照するのかを指定しません。

この問題をデバッグして修正する方法はありますか?私はこれが構成の問題だと思う。私はJavaScriptを使用してbase64文字列にファイルを変換し、テキスト文字列としてファイルを送信し、これを解決した

# Nelmio CORS Configuration 
nelmio_cors: 
    defaults: 
     allow_credentials: false 
     allow_origin: ['*'] 
     allow_headers: ['*'] 
     allow_methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'] 
     max_age: 3600 
     hosts: [] 
     origin_regex: false 

# FOSRest Configuration 
fos_rest: 
    body_listener: true 
    body_converter: 
     enabled: true 
     validate: true 
     validation_errors_argument: validationErrors # This is the default value 
    format_listener: 
     rules: 
      - { path: '^/', priorities: ['json'], fallback_format: json, prefer_extension: false } 
    param_fetcher_listener: true 
    view: 
     view_response_listener: 'force' 
     formats: 
      json: true 
      html: false 
# 
# Needed for being able to use ParamConverter 
sensio_framework_extra: 
    request: { converters: true } 

答えて

0
私は実装ソリューションはParamConverterアノテーションで手動で通常(このプロジェクトで)処理されたタスク(直列化復元と検証)を取り扱うに降りてくる

  1. 変更コントローラ
  2. 手動での署名手動でデータ
  3. をデシリアライズもデータ

を検証し、エラーメッセージがJMSSerializerによって送信されたようです。今

/** 
* @Rest\Post("") 
*/ 
public function postAction(Request $request) 
{ 
    // 
    // Deserialisation 
    $dto = $this->deserializeDto($request); 
    if ($dto == null) { 
    return $this->view("Invalid 'dto' parameter contents.", response::HTTP_BAD_REQUEST); 
    } 

    // 
    // Validation: the name ('Nom') and a file are required 
    $validationErrors = [ ]; 
    if ($dto->getNom() === null || strlen($dto->getNom()) == 0) { 
    $validationErrors[] = "'Nom' is missing"; 
    } 
    $file = $request->files->get("file"); 
    if ($file === null) { 
    $validationErrors[] = "No file provided"; 
    } 
    if (count($validationErrors) > 0) { 
    $view = $this->view($validationErrors, response::HTTP_BAD_REQUEST); 
    return $view; 
    } 

    // 
    // processing 
    return $this->doSave($dto, $request); 
} 

以前は(私はおそらくこのような何かを持っていた):

/** 
* @Rest\Post("") 
* @ParamConverter("dto", converter="fos_rest.request_body", options={"validator"={"groups"={"edit"}}}) 
* @Rest\QueryParam(name="dto", nullable=false) 
*/ 
public function postAction(Request $request, Document $dto, ConstraintViolationListInterface $validationErrors) 
{ 
.... 
} 

あり(検証部を含む)これを行うのより良い方法であることが、私がする必要がありこの時点で前進する。リファクタリングは後で行われます。

0

:ここで私はconfig.ymlにデフォルトsymfonyの設定に追加した要素があります。

関連する問題