2009-07-16 12 views
5

मैं ब्राउज़र में फ़ाइल प्रस्तुत करने के लिए एक फ़ाइल सामग्री का उपयोग कर रहा हूं। यह अच्छी तरह से काम करता है सिवाय इसके कि जब यह फ़ाइल नाम में अंतरराष्ट्रीय वर्ण होते हैं तो यह एक अपवाद फेंकता है। मुझे कहीं पढ़ना याद है कि यह सुविधा अंतरराष्ट्रीय पात्रों का समर्थन नहीं करती है, लेकिन मुझे यकीन है कि अमेरिका के अलावा अन्य देशों में फ़ाइलों को अपलोड करने की आवश्यकता के मामलों में लोगों को एक वर्कअराउंड या सर्वोत्तम अभ्यास करना चाहिए।FileContentResult और अंतरराष्ट्रीय वर्ण

किसी को भी इस तरह के एक अभ्यास के पता है? यहाँ ActionResult विधि है पहले से

public ActionResult GetFile(byte[] value, string fileName) 
    { 
     string fileExtension = Path.GetExtension(fileName); 
     string contentType = GetContentType(fileExtension); //gets the content Type 
     return File(value, contentType, fileName); 
    } 

धन्यवाद

सुसान

उत्तर

6
public class UnicodeFileContentResult : ActionResult { 

    public UnicodeFileContentResult(byte[] fileContents, string contentType) { 
     if (fileContents == null || string.IsNullOrEmpty(contentType)) { 
      throw new ArgumentNullException(); 
     } 

     FileContents = fileContents; 
     ContentType = contentType; 
    } 

    public override void ExecuteResult(ControllerContext context) { 
     var encoding = UnicodeEncoding.UTF8; 
     var request = context.HttpContext.Request; 
     var response = context.HttpContext.Response; 

     response.Clear(); 
     response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", (request.Browser.Browser == "IE") ? HttpUtility.UrlEncode(FileDownloadName, encoding) : FileDownloadName)); 
     response.ContentType = ContentType; 
     response.Charset = encoding.WebName; 
     response.HeaderEncoding = encoding; 
     response.ContentEncoding = encoding; 
     response.BinaryWrite(FileContents); 
     response.End(); 
    } 

    public byte[] FileContents { get; private set; } 

    public string ContentType { get; private set; } 

    public string FileDownloadName { get; set; } 
} 
+0

क्या यह फ़ाइलडाउनलोडनाम में अंतरराष्ट्रीय वर्ण होने पर भी काम करता है? दुर्भाग्य से – RezaRahmati

+0

@rezarahmati नहीं। लेकिन अंतरराष्ट्रीय फ़ाइल नामों के लिए आप इस उदाहरण का उपयोग कर सकते हैं: https://gist.github.com/AlexMAS/c874bc03bff8a2717e18 – AlexMAS

0

मैं इसमें अंतरराष्ट्रीय पात्रों के साथ फ़ाइलों को डाउनलोड किया जा सकता है नहीं लगता फ़ाइल का नाम फ़ाइल का नाम Content-disposition शीर्षलेख का हिस्सा है, और सभी HTTP शीर्षकों की तरह, ASCII के अलावा एक अलग एन्कोडिंग का उपयोग करने का कोई तरीका नहीं है जो सभी ब्राउज़रों और प्रॉक्सी में काम करेगा।

अंतरराष्ट्रीय पात्रों के साथ अपलोड कर रहा है फ़ाइलों कोई समस्या नहीं है, हालांकि, के बाद से फ़ाइल नाम सामान्य रूप डेटा (application/www-url-encoded)

+0

मुझे पता है कि मैंने इसे कुछ वेबसाइटों पर आजमाया और यह स्वीडिश पात्रों के साथ अच्छी तरह से काम करता है इसलिए एक वैकल्पिक समाधान होना चाहिए। उदाहरण के लिए यदि आप फ़ाइल को जीमेल में संलग्न करते हैं और इसे डाउनलोड करते हैं, भले ही इसमें अंतरराष्ट्रीय वर्ण हों, फिर भी यह अच्छी तरह से काम करता है। एक बात जो मैं सोच सकता हूं वह फ़ाइल को सीधे प्रतिक्रिया में संलग्न कर रहा है लेकिन फिर मैं इसे एमवीसी में क्लाइंट को वापस कैसे भेजूंगा? – suzi167

+0

आप रिवर्स-इंजीनियर का प्रयास कर सकते हैं कि Google यह कैसे करता है और एक्शनरसल्ट से प्राप्त अपनी खुद की कक्षा बनाते हैं, जहां आप जो कुछ भी चाहते हैं उसे वापस कर सकते हैं (एएसपी.नेट द्वारा सीमित किए जाने से सीमित)। – chris166

0

मैं इसे अपने responseHeaderEncoding पर निर्भर करता है लगता है के रूप में प्रसारित किया जाता है (http://msdn.microsoft.com/en-us/library/hy4kkhe0.aspx देखें) होना चाहिए

HTH,

एरिक

0
public FileContentResult XmlInvoice(Order order) 
{ 
    string stream = order.Win1250StringData; 
    var bytes = Encoding.GetEncoding("windows-1250").GetBytes(stream); 
    var fr = new FileContentResult(bytes, "application/xml"); 
    fr.FileDownloadName = string.Format("FV{0}.xml", order.DocumentNumber); 
    return fr; 
} 

बाइट्स यूटीएफ -8 या विन 1250 से अलग आकार के होते हैं। सही एन्कोडिंग में स्ट्रिंग से बाइट प्राप्त करके आपको स्ट्रिंग को सही तरीके से समझना होगा।

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