আমি জানি এটি একটি পুরানো পোস্ট তবে এটি এখনও খুব প্রাসঙ্গিক। আমি খুঁজে পেয়েছি যে আধুনিক ব্রাউজারগুলি rfc5987 সমর্থন করে, যা utf-8 এনকোডিং, শতাংশ এনকোডেড (ইউআরএল-এনকোডড) দেয়। তারপরে Naïve file.txt হয়ে যায়:
Content-Disposition: attachment; filename*=UTF-8''Na%C3%AFve%20file.txt
সাফারি (5) এটি সমর্থন করে না। পরিবর্তে আপনার সরাসরি আপনার utf-8 এনকোডড শিরোনামে ফাইলের নাম লেখার সাফারি স্ট্যান্ডার্ডটি ব্যবহার করা উচিত:
Content-Disposition: attachment; filename=Naïve file.txt
আইই 8 এবং এর চেয়ে বেশি বয়স্করা এটি সমর্থন করে না এবং আপনাকে ইউটিএফ -8 এনকোডিংয়ের শতাংশের মানটি ব্যবহার করতে হবে, শতাংশ এনকোডেড:
Content-Disposition: attachment; filename=Na%C3%AFve%20file.txt
এএসপি.নেটে আমি নিম্নলিখিত কোডগুলি ব্যবহার করি:
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);
আমি উপরের আইআই 7, আইই 8, আই 9, ক্রোম 13, অপেরা 11, এফএফ 5, সাফারি 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);
ডাউনলোডের জন্য এই ফাইলের নামটি ব্যবহার করে উপরেরগুলি এখন আই 7-11, ক্রোম 32, অপেরা 12, এফএফ 25, সাফারি 6 এ পরীক্ষিত হয়েছে: c abcABCæøåÆØÅäöüïëêîâéíáóúýñ½§! # ¤% & () = `@ £ $ € {[]} + ´¨ ^ ~ '-_;। পাঠ্য
আই 7 এ এটি কিছু চরিত্রের জন্য কাজ করে তবে সমস্ত নয়। তবে আজকাল আই 7 কে কে পাত্তা দেয়?
অ্যান্ড্রয়েডের জন্য নিরাপদ ফাইলের নাম উত্পন্ন করতে আমি এই ফাংশনটি ব্যবহার করি। নোট করুন যে অ্যান্ড্রয়েডে কোন অক্ষরগুলি সমর্থিত তা আমি জানি না তবে আমি পরীক্ষিত করেছি যে এটি নিশ্চিতভাবে কাজ করে:
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);
}
@ টমজেড: আমি আই 7 এবং আইই 8 তে পরীক্ষা করেছি এবং এটি প্রমাণিত হয়েছে যে আমাকে অ্যাস্টোস্ট্রোফ (') এড়িয়ে চলার দরকার নেই। এটি ব্যর্থ হয় যেখানে আপনার একটি উদাহরণ আছে?
@ ডেভ ভ্যান ডেন এঁয়েডে: আরএফসি 6266 অনুসারে দুটি লাইনের ফাইল এক সাথে যুক্ত করা অ্যান্ড্রয়েড এবং আই 7 + 8 ব্যতীত কাজ করে এবং এটিকে প্রতিফলিত করার জন্য আমি কোডটি আপডেট করেছি। আপনার পরামর্শের জন্য ধন্যবাদ।
@ থিলো: গুডরিডার বা অন্য কোনও ব্রাউজার সম্পর্কিত কোনও ধারণা নেই। অ্যান্ড্রয়েড পদ্ধতির সাহায্যে আপনার কিছু ভাগ্য হতে পারে।
@ অ্যালেক্স huুকভস্কি: কেন জানি না তবে কানেক্টে আলোচিত হিসাবে মনে হচ্ছে এটি মারাত্মকভাবে কাজ করবে না।