2016-03-22 25 views
0

Web APIを使用して、データベースにファイルストリームとして保存されているドキュメントをアップロードするSilverlightアプリケーションがあります。現在はのContent-Type:application/jsonのPOSTによって実行されます。ファイルのバイト配列とファイルに関するメタデータを含むオブジェクトは、JSONにシリアル化され、Web APIにポストされます。 Web APIはバイト配列をFilestreamとしてデータベースに保存します。私はマルチパートのContent-TypeのようPostにこのロジックを変更したいマルチパートリクエストを使用してWeb APIにファイルをアップロード

{"FileContent":"JVBERi0xLjUNJeLjz9MNCjEwIDAgb2JqDTw8L0xpbmVhcml6ZWQgMS9MIDI3MTg2L08gMTIvRSAyMjYyNi9OIDEvVCAyNjg4NC9IIFsgNDg5IDE2OF0+Pg1lbmRvYmoNICAgICAgICAgICAgICAgICAgDQoyNyAwIG9iag08PC9EZWNvZGVQYXJtczw8L0NvbHVtbnMgNC9QcmVkaWN0b3IgMTIg0K","ProductId":"85c98324-092a-4d10-bab0-03912e437234","OrderId":"7b826322-7526-4a69-b67c-5c88a04f4c60","FileName":"test.pdf","FileType":1,"FileDescription":"test"} 

:後

は、現在のリクエストのサンプルです。私の要求を形成する最良の方法は何でしょうか?また、Web API Controllerを構成してMultipartリクエストを処理する最良の方法は何ですか?

答えて

1

これはMultipartのアップロードのサンプルです。

[HttpPost] 
    [Route("upload")] 
    public async Task<IHttpActionResult> Upload() 
    { 
     MultipartFileData file = null; 

     // Check if the request contains multipart/form-data. 
     if (!Request.Content.IsMimeMultipartContent()) 
     { 
      return UnsupportedMediaType(); 
     } 

     // initialize path and provider 
     string root = HttpContext.Current.Server.MapPath("~/App_Data"); 
     if (Directory.Exists(root) == false) Directory.CreateDirectory(root); 

     var provider = new MultipartFormDataStreamProvider(root); 

     // Read the form data. 
     await Request.Content.ReadAsMultipartAsync(provider); 

     try 
     { 
      // we take the first file here 
      file = provider.FileData[0]; 

      // and the associated datas 
      int myInteger; 
      if (int.TryParse(provider.FormData["MyIntergerData"], out myInteger) == false) 
       throw new ArgumentException("myInteger is missing or not valid."); 

      var fileContent = File.ReadAllBytes(file.LocalFileName); 

      // do something with your file! 
     } 
     finally 
     { 
      // get rid of temporary file 
      if (file != null) 
       File.Delete(file.LocalFileName); 
     } 

     // successfull! 
     return NoContent(); 
    } 

これは私のAPIのサンプルです。アップロードごとに複数のファイル(provider.FileData配列をチェック)と、provider.FormData配列内の異なるデータを持つことができます。

このクライアント側の側面については、thisがこのAPIへのJS呼び出しのサンプルを確認することをお勧めします。

希望すると助かります!

+0

返信いただきありがとうございます。私は、メタデータと共にファイルを含む私の要求を形成する最良の方法が何であるかを調べることを検討しています。また、私はファイルをSQL DB内のFilestreamファイルに保存することを検討しています。私のコントローラーでこれを行う最善の方法は何でしょうか? –

+0

js uploadのクライアント側サンプルへのリンクを使用して私の回答を更新しました。 filestramの場合は、どのようにデータにアクセスするかによって異なります。 SqlFileStreamを使用してサンプルを確認してください:https://blogs.msdn.microsoft.com/spike/2011/02/28/inserting-a-file-into-a-filestream-table-from-c-and-how/ –

+0

MultipartFormDataStreamProviderを使用すると、Filestreamカラムにファイルを保存する前に一時ディレクトリにファイルを一時的に保存することが最良の方法ですか?また、SilverlightまたはUWPからPOSTを実行している場合、FormDataも使用しますか? –

関連する問題