मुझे पता है कि यह एक पुरानी पोस्ट है लेकिन यह अभी भी बहुत प्रासंगिक है। मैंने पाया है कि आधुनिक ब्राउज़र rfc5987 का समर्थन करते हैं, जो utf-8 एन्कोडिंग, प्रतिशत एन्कोडेड (url- एन्कोडेड) की अनुमति देता है। फिर Na Thenve file.txt बन जाता है:
Content-Disposition: attachment; filename*=UTF-8''Na%C3%AFve%20file.txt
सफारी (5) इसका समर्थन नहीं करती है। इसके बजाय आपको फ़ाइल का नाम सीधे अपने utf-8 एन्कोडेड हेडर में लिखने के सफारी मानक का उपयोग करना चाहिए:
Content-Disposition: attachment; filename=Naïve file.txt
IE8 और पुराने इसे या तो समर्थन नहीं करते हैं और आपको utf-8 एन्कोडिंग के IE मानक का उपयोग करने की आवश्यकता है, प्रतिशत एन्कोडेड:
Content-Disposition: attachment; filename=Na%C3%AFve%20file.txt
ASP.Net में मैं निम्नलिखित कोड का उपयोग करता हूं:
string contentDisposition;
if (Request.Browser.Browser == "IE" && (Request.Browser.Version == "7.0" || Request.Browser.Version == "8.0"))
contentDisposition = "attachment; filename=" + Uri.EscapeDataString(fileName);
else if (Request.Browser.Browser == "Safari")
contentDisposition = "attachment; filename=" + fileName;
else
contentDisposition = "attachment; filename*=UTF-8''" + Uri.EscapeDataString(fileName);
Response.AddHeader("Content-Disposition", contentDisposition);
मैंने IE7, IE8, IE9, Chrome 13, Opera 11, FF5, Safari 5 का उपयोग करके उपरोक्त परीक्षण किया।
अद्यतन नवंबर 2013:
यहां वह कोड है जो मैं वर्तमान में उपयोग करता हूं। मुझे अभी भी IE8 का समर्थन करना है, इसलिए मैं पहले भाग से छुटकारा नहीं पा सकता हूं। यह पता चलता है कि एंड्रॉइड पर ब्राउज़र अंतर्निहित एंड्रॉइड डाउनलोड प्रबंधक का उपयोग करते हैं और यह मानक तरीके से फ़ाइल नामों को पार्स नहीं कर सकता है।
string contentDisposition;
if (Request.Browser.Browser == "IE" && (Request.Browser.Version == "7.0" || Request.Browser.Version == "8.0"))
contentDisposition = "attachment; filename=" + Uri.EscapeDataString(fileName);
else if (Request.UserAgent != null && Request.UserAgent.ToLowerInvariant().Contains("android")) // android built-in download manager (all browsers on android)
contentDisposition = "attachment; filename=\"" + MakeAndroidSafeFileName(fileName) + "\"";
else
contentDisposition = "attachment; filename=\"" + fileName + "\"; filename*=UTF-8''" + Uri.EscapeDataString(fileName);
Response.AddHeader("Content-Disposition", contentDisposition);
उपरोक्त अब IE7-11, Chrome 32, Opera 12, FF25, Safari 6 में परीक्षण किया गया, डाउनलोड के लिए इस फ़ाइलनाम का उपयोग करते हुए: download abcABCæøåÆØÅäöüïëêîâéíáóýñ½§! # ¤% & () = `@ £ $ € {[]} + ´¨ ^ ~ '-_,;। txt
IE7 पर यह कुछ पात्रों के लिए काम करता है लेकिन सभी के लिए नहीं। लेकिन आजकल IE7 की परवाह किसे है?
यह वह फ़ंक्शन है जिसका उपयोग मैं एंड्रॉइड के लिए सुरक्षित फ़ाइल नाम उत्पन्न करने के लिए करता हूं। ध्यान दें कि मुझे नहीं पता कि कौन से वर्ण Android पर समर्थित हैं, लेकिन मैंने परीक्षण किया है कि ये सुनिश्चित करने के लिए काम करते हैं:
private static readonly Dictionary<char, char> AndroidAllowedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ._-+,@£$€!½§~'=()[]{}0123456789".ToDictionary(c => c);
private string MakeAndroidSafeFileName(string fileName)
{
char[] newFileName = fileName.ToCharArray();
for (int i = 0; i < newFileName.Length; i++)
{
if (!AndroidAllowedChars.ContainsKey(newFileName[i]))
newFileName[i] = '_';
}
return new string(newFileName);
}
@ टॉम: मैंने IE7 और IE8 में परीक्षण किया और यह पता चला कि मुझे एपोस्ट्रोफ (') से बचने की आवश्यकता नहीं है। क्या आपके पास एक उदाहरण है जहां यह विफल रहता है?
@ डेव वान डेन आईंडे: आरएफसी 6266 एंड्रॉइड और IE7 + 8 को छोड़कर काम करता है और एक लाइन पर दो फ़ाइल नामों को मिलाकर मैंने इसे प्रतिबिंबित करने के लिए कोड अपडेट किया है। सुझाव के लिए धन्यवाद।
@ थिलो: गुडरीडर या किसी अन्य गैर-ब्राउज़र के बारे में कोई विचार नहीं है। एंड्रॉइड दृष्टिकोण का उपयोग करके आपके पास कुछ भाग्य हो सकते हैं।
@ एलेक्स ज़ुकोव्स्की: मुझे नहीं पता कि क्यों लेकिन कनेक्ट पर चर्चा के रूप में यह बहुत अच्छी तरह से काम नहीं करता है।