2012-06-10 14 views
31

मैं एएसपी.नेट वेब एपीआई का उपयोग कर फाइल अपलोड कर रहा हूं। मैंने आरसी से पहले यह किया है लेकिन किसी कारण से फ़ाइल को फ़ाइल नाम के बजाय "BodyPart_3ded2bfb-40be-4183-b789-9301f93e90af" के रूप में सहेजा जा रहा है। नीचे फ़ाइल नाम वैरिएबल फ़ाइल नाम के बजाय इस bodypart स्ट्रिंग को भी देता है। मुझे यह पता लगाना प्रतीत नहीं होता कि मैं कहां जा रहा हूं। किसी भी मदद की सराहना की है।एएसपी.नेट वेब एपीआई फ़ाइल "बॉडीपार्ट_3ded2bfb-40be-4183-b789-9301f93e90af" के रूप में सहेजी गई है

क्लाइंट कोड:

function upload() { 
    $("#divResult").html("Uploading..."); 
    var formData = new FormData($('form')[0]); 
    $.ajax({ 
     url: 'api/files/uploadfile?folder=' + $('#ddlFolders').val(), 
     type: 'POST', 
     success: function (data) { 
      $("#divResult").html(data); 
     }, 
     data: formData, 
     cache: false, 
     contentType: false, 
     processData: false 
    }); 
}; 

नियंत्रक:

public Task<HttpResponseMessage> UploadFile([FromUri]string folder) 
    { 
     if (!Request.Content.IsMimeMultipartContent()) 
     { 
      throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.UnsupportedMediaType)); 
     } 

     // Save file 
     MultipartFormDataStreamProvider provider = new MultipartFormDataStreamProvider(HttpContext.Current.Server.MapPath("~/Files")); 
     Task<IEnumerable<HttpContent>> task = Request.Content.ReadAsMultipartAsync(provider); 

     return task.ContinueWith<HttpResponseMessage>(contents => 
     { 
      string filename = provider.BodyPartFileNames.First().Value; 
      return new HttpResponseMessage() 
      { 
       Content = new StringContent(string.Format("File saved in {0}.", folder)) 
      }; 

     }, TaskScheduler.FromCurrentSynchronizationContext()); 

फ़ाइलों की तरह देख रहे हैं:

enter image description here

+0

मैं यहाँ मेरा पूरा उदाहरण ऊपर लिखा है: http://rivdiv.wordpress.com/2012/06/13/uploading-a-file-using-asp-net-web-api/ – Rivka

उत्तर

44

एक सचेत हमने परिवर्तन था - यह माना जाता था सामग्री-डिस्पोजिटी में प्रदान किए गए फ़ाइल नाम को लेने का एक सुरक्षा जोखिम हेडर फ़ील्ड पर और इसलिए इसके बजाय अब हम एक फ़ाइल नाम की गणना करते हैं जो आप देख रहे हैं।

यदि आप सर्वर स्थानीय फ़ाइल नाम को स्वयं नियंत्रित करना चाहते हैं तो आप मल्टीपार्टफॉर्मडेटास्ट्रीमप्रोवाइडर से प्राप्त कर सकते हैं और जो भी नाम चाहते हैं उसे प्रदान करने के लिए GetLocalFileName को ओवरराइड कर सकते हैं। ध्यान दें कि ऐसा करने पर सुरक्षा विचार हो सकते हैं।

आशा इस मदद करता है,

हेनरिक

+3

आपके उत्तर के लिए धन्यवाद। फिर मैं वास्तविक फ़ाइल को सही तरीके से कैसे सहेजूं? अभी यह "फाइल" डेटा प्रकार का है, जिसमें कोई विस्तार नहीं है और इसे खोला नहीं जा सकता है। – Rivka

+4

मुझे अभी के लिए एक कार्य-आस-पास मिला - फ़ाइल का उपयोग करने के लिए। * प्रदाता। बॉडीपार्टफाइल नामों का उपयोग करके सही एक्सटेंशन जोड़ें। फर्स्टऑरडिफॉल्ट()। Key.TrimStart ('' ')। TrimEnd (' '') * प्राप्त करने के लिए मूल फ़ाइल नाम। हालांकि यह थोड़ा सा पीछे लगता है। मैं किसी भी ज्ञान की सराहना करता हूं। धन्यवाद। – Rivka

+1

सार्वजनिक वर्ग FormDataStreamer: MultipartFormDataStreamProvider { सार्वजनिक FormDataStreamer (स्ट्रिंग rootPath): आधार (rootPath) {} सार्वजनिक FormDataStreamer (स्ट्रिंग rootPath, पूर्णांक bufferSize): आधार (rootPath, bufferSize) {} सार्वजनिक ओवरराइड स्ट्रिंग GetLocalFileName (HttpContentHeaders हेडर) { वर srcFileName = headers.ContentDisposition.FileName.Replace ("\" "," "); वापसी Guid.NewGuid() + Path.GetExtension (srcFileName); } } –

16

मैं इसे ASP.NET वेब एपीआई आर सी के साथ काम करने के लिए ट्यूटोरियल के लिए कोड अद्यतन किया गया। दरअसल, जैसा कि हेनरिक ने सामग्री-विस्थापन का उल्लेख किया है, अब फ़ाइल नाम का उपयोग नहीं किया गया है। पोस्ट के नीचे स्रोत फ़ाइलों को देखें - http://www.strathweb.com/2012/04/html5-drag-and-drop-asynchronous-multi-file-upload-with-asp-net-webapi/

कृपया ध्यान दें कि मल्टीपार्टफॉर्मडेटास्ट्रीमप्रोवाइडर में और परिवर्तन हैं जो आरसी में कटौती नहीं करते हैं, इसलिए अब यह और भी लचीला है। हेनरिक ने यहां उन लोगों के बारे में ब्लॉग किया - http://blogs.msdn.com/b/henrikn/archive/2012/04/27/asp-net-web-api-updates-april-27.aspx

संपादित करें: मैं वेब एपीआई आरटीएम में फ़ाइलों को अपलोड करने के नए और उन्नत तरीके के बारे में ब्लॉग किया है, ताकि उम्मीद है कि मदद चीजों का आयोजन किया जाता है चाहिए - http://www.strathweb.com/2012/08/a-guide-to-asynchronous-file-uploads-in-asp-net-web-api-rtm/

+0

थैंक्स, आपका उदाहरण पढ़ने और अनुसरण करना आसान है। मैंने बीटा कोड का उपयोग करके अपना खुद लिखा था डी आरसी में इसे कैसे करना है यह जानने की कोशिश कर मेरे बालों को खींच रहा था। – Keith

+0

धन्यवाद फिलिप। तो मैं कुंजी से मूल फ़ाइल प्राप्त करने के लिए सही तरीका * है * और फिर फ़ाइल को ले जा रहा/नाम बदल रहा हूं। किसी भी वेब एपीआई लेख में नहीं आया था जिसमें इस विशेष आरसी परिवर्तन को निर्दिष्ट किया गया था, खुशी है कि मैंने यह सवाल वहां रखा है। धन्यवाद। – Rivka

+0

यह सिर्फ सुंदर है। एक जादू की तरह काम करता है! – Detilium

7

यहाँ, मेरे लिए यह काम

में एपीआई नियंत्रक

// We implement MultipartFormDataStreamProvider to override the filename of File which 
// will be stored on server, or else the default name will be of the format like Body- 
// Part_{GUID}. In the following implementation we simply get the FileName from 
// ContentDisposition Header of the Request Body. 
public class CustomMultipartFormDataStreamProvider : MultipartFormDataStreamProvider 
{ 
    public CustomMultipartFormDataStreamProvider(string path) : base(path) { } 

    public override string GetLocalFileName(HttpContentHeaders headers) 
    { 
     return headers.ContentDisposition.FileName.Replace("\"", string.Empty); 
    } 
} 
फिर

string root = HttpContext.Current.Server.MapPath("~/App_Data");  
CustomMultipartFormDataStreamProvider provider = new CustomMultipartFormDataStreamProvider(root); 

धन्यवाद,