2015-01-11 6 views
10

शुभ दिन!वेब एपीआई सर्वर पर फ़ाइलों को कैसे अपलोड करें और कार्रवाई के साथ पैरामीटर भेजें?

मैं एएसपी.NET वेब एपीआई 2 प्रोजेक्ट पर काम कर रहा हूं। एक निश्चित बिंदु पर कुछ फाइलें अपलोड करने की आवश्यकता है। फ़ाइलों को एक निश्चित फ़ाइल मॉडल (हमारी अपनी कक्षा) से जोड़ा जाना चाहिए। इसलिए, क्लाइंट को माइक्रोनिएबल को पैरामीटर और फाइलों को सामग्री के रूप में भेजने की आवश्यकता है। क्योंकि यह एक विश्वसनीय API है, दोनों को एक ही अनुरोध में भेजा जाना है।

public async Task<HttpResponseMessage> Add([FromUri] IEnumerable<FileModel> fileModels) 
{ 
    // REQUEST INTEGRITY TESTING 

    var streamProvider = new CustomMultipartFormDataStreamProvider(fileSavePath, fileModels); 
    // Read the MIME multipart content using the stream provider we just created. 
    var work = await Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith(async t => 
     { 
      // SOME WORK DONE AFTER SAVING THE FILES TO THE HARD DRIVE 
     } 

} 

समस्या पीछा कर रहा है:

सबसे अच्छा हम साथ आ सकता है

पालन नियंत्रक कार्रवाई है फ़ाइलों को एक 'बहुखण्डीय/फार्म-डेटा' Content-Type हैडर के साथ अपलोड की जा रही हैं। सर्वर पक्ष पर फ़ाइलों को हेरफेर करने से पहले हमें FileModels की सामग्री को जानने की आवश्यकता है। यदि हम MultipartFormDataStreamProvider का उपयोग करते हैं, तो फ़ाइलों को हार्ड ड्राइव पर सहेजे जाने के बाद हम केवल गैर फ़ाइल पैरामीटर तक पहुंच सकते हैं।

इसके लिए एकमात्र कामकाज हमें मिल सकता है यूआरएल में IENumerable < FileModel> पैरामीटर भेजना है। लेकिन यह देखते हुए कि यूआरएल की सीमित अधिकतम लंबाई है, यह एक विश्वसनीय विधि नहीं है।

सवाल है: अनुरोध के शरीर में दोनों IEnumerable < FileModel> fileModels पैरामीटर और फ़ाइलों सबमिट करें और फ़ाइलों तक पहुँचने से पहले fileModels पैरामीटर तक पहुँच प्राप्त करने के लिए एक तरीका है? हम भी HttpContext.Current.Request.Files.Count का उपयोग करने में सक्षम होना चाहते हैं;

फ़ाइल अपलोड करने के लिए हमारे वर्तमान jQuery इस तरह दिखता है (प्रारंभिक परीक्षण प्रयोजनों के लिए, यह केवल एक फाइल अपलोड का समर्थन करता है):

$('#Upload').click(function(e) { 
      e.preventDefault(); 

      var headers = new Array(); 
      headers["SessionId"] = sessionId; 

      var files = $('#fileInput').get(0).files; 
      var formData = new FormData(); 
      formData.append("files", files[0]); 

      var fileModel = $('#fileSubmission').serialize(); 

      $.ajax({ 
       url: "api/Submissions/Add/?" + fileModel, 
       headers: headers, 
       type: 'POST', 
       data: formData, 
       cache: false, 
       contentType: false, 
       processData: false, 
       dataType: 'json' 
      }); 
     }); 

आपको बहुत बहुत धन्यवाद!

+0

आप के रूप में पूरे डेटा भेजने पर विचार किया है जेएसओएन और इसे 'स्ट्रीम' और मेटाडाटा पैरामीटर वाली कक्षा में बस deserializing? –

+0

हां, लेकिन फ़ाइल हमेशा शून्य हो जाती है। –

+0

क्या आपने MultipartFormDataStreamProvider का उपयोग करने का प्रयास किया था। इस नमूना को देखें https://damienbod.wordpress.com/2014/03/28/web-api-file-upload-single-or-multiple-files/ – usp

उत्तर

संबंधित मुद्दे

 संबंधित मुद्दे