2016-03-22 13 views
0

Veritabanında bir Filestream olarak saklanan bir belgeyi yüklemek için Web API'sini kullanan bir Silverlight uygulamasına sahibim. Şu anda bir Content-Type: application/json ile bir POST tarafından yapılır. Dosyanın bir bayt dizisi ile birlikte dosya hakkında bazı meta veriler içeren nesne, JSON'a serileştirilir ve Web API'sine gönderilir. Web API daha sonra bayt dizisini Veritabanına bir Filestream olarak kaydeder. Ben bir Content-Type Multipart olarak Post'a bu mantığı değiştirmek istiyorumDosya: Multipart isteği kullanılarak Web API'ye yükleniyor

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

: Aşağıdaki

geçerli isteğin bir örneğidir. Talebimi oluşturmanın en iyi yolu ne olurdu? Ayrıca, Multipart isteğini işlemek için Web API Controller'ı yapılandırmanın en iyi yolu nedir?

cevap

1

Bu, Çok Parçalı yükleme için bir örnektir.

[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(); 
    } 

Bu, benim bir API'mden aldığım bir örnektir. Her yükleme için birden fazla dosyaya sahip olabilirsiniz (provider.FileData dizisini kontrol edin) ve provider.FormData dizisinin içindeki farklı veriler.

İstemci tarafı açısından, bu API'ye bir JS çağrısı örneği için this yanıtını kontrol etmenizi öneririm.

Umut eder!

+0

Cevabınız için teşekkür ederiz. Meta veriyle birlikte dosyayı içerecek şekilde isteğimi oluşturmanın en iyi yolunun ne olduğunu belirlemek için arıyorum. Ayrıca, dosyayı SQL DB'de bir Filestream dosyasına depolamak istiyorum. Bunu kontrol cihazımla yapmanın en iyi yolu ne olurdu? –

+0

Cevabımı, js yüklemesinin bir istemci tarafı örneğine bağlantıyla güncelledim. Filistin meselesi için, verilerinize nasıl erişeceğinize bağlıdır; Bunu SqlFileStream kullanarak küçük bir örnek için kontrol edin: https://blogs.msdn.microsoft.com/spike/2011/02/28/inserting-a-file-into-a-filestream-table-from-c-and-how -to-get-it-back-as-well/ –

+0

MultipartFormDataStreamProvider kullanırken, dosyaları geçici bir dizinde Filestream sütununa kaydetmeden önce geçici olarak saklamak için en iyi yoldur? Ayrıca, Silverlight veya UWP'den bir POST yapıyorum, yine de FormData kullanır mıyım? –

İlgili konular