কীভাবে এইচটিটিপিতে কনটেন্ট-ডিসপোজিশন শিরোনামের ফাইলনাম প্যারামিটারটি এনকোড করা যায়?


533

ওয়েব অ্যাপ্লিকেশনগুলি যে কোনও ওয়েব ব্রাউজারে সরাসরি রেন্ডার করার পরিবর্তে কোনও সংস্থান ডাউনলোড করতে বাধ্য করতে চায় ফর্মের এইচটিটিপি প্রতিক্রিয়ায় একটি শিরোনাম দেয়:Content-Disposition

Content-Disposition: attachment; filename=FILENAME

filenameপ্যারামিটার যা রিসোর্স ব্রাউজার দ্বারা ডাউনলোড করা হয় ফাইলের জন্য একটি নাম প্রস্তাব করার জন্য ব্যবহার করা যাবে। আরএফসি 2183 (বিষয়বস্তু-বিশৃঙ্খলা) তবে বিভাগ ২.৩ (ফাইলের নাম প্যারামিটার) এ বলা হয়েছে যে ফাইলটির নামটি কেবল মার্কিন-এএসসিআইআই অক্ষর ব্যবহার করতে পারে:

বর্তমানের [আরএফসি 2045] ব্যাকরণ প্যারামিটার মানগুলিকে (এবং তাই সামগ্রী-বিশৃঙ্খলা ফাইলের নামগুলি) ইউএস-এএসসিআইতে সীমাবদ্ধ করে। আমরা ফাইলের নামগুলিতে স্বেচ্ছাচারী চরিত্র সেট করার অনুমতি দেওয়ার দুর্দান্ত আকাঙ্ক্ষাকে স্বীকার করি, তবে প্রয়োজনীয় প্রক্রিয়াগুলি সংজ্ঞায়িত করা এই নথির আওতার বাইরে।

তথাপি প্রমাণিত প্রমাণ রয়েছে, তবুও, যে বেশিরভাগ জনপ্রিয় ওয়েব ব্রাউজারগুলি এখনও ইউএস-এএসসিআইআই অক্ষরগুলিকে অনুমতি দেয় না বলে মনে হয় (কোনও মানের অভাবে) ফাইলের নামের এনকোডিং স্কিম এবং চরিত্রের নির্দিষ্টকরণের বিষয়ে দ্বিমত পোষণ করে। তাহলে প্রশ্নটি হল, জনপ্রিয় ব্রাউজারগুলির দ্বারা ব্যবহৃত বিভিন্ন স্কীম এবং এনকোডিংগুলি কী কী যদি "naïvefile" ফাইলটির নাম (কোটস ছাড়াই এবং তৃতীয় অক্ষরটি U + 00EF হয়) কন্টেন্ট-ডিসপজিশন শিরোনামে এনকোড করা প্রয়োজন?

এই প্রশ্নের প্রয়োজনে জনপ্রিয় ব্রাউজারগুলি হ'ল:

  • ফায়ারফক্স
  • ইন্টারনেট এক্সপ্লোরার
  • আফ্রিকায় শিকার অভিযান
  • গুগল ক্রম
  • অপেরা

এটি মোবাইল সাফারি (@ মার্টিন আর্দিং-থমসেনের পরামর্শ অনুসারে কাঁচা utf-8) এর জন্য কাজ করছে, কিন্তু এটি একই ডিভাইস থেকে গুডরিডারের পক্ষে কাজ করে না। কোন ধারনা?
থিলো


1
কর্নেলের উত্তরটি সর্বনিম্ন প্রতিরোধের পথ হিসাবে প্রমাণিত হয়েছে, যদি আপনি এই পথের শেষ অংশটি সেট করতে পারেন; এই সাথে দম্পতি Content-Disposition: attachment
অ্যান্টি হাপালা

উত্তর:


94

প্রস্তাবিত আরএফসি 5987 , "হাইপারটেক্সট ট্রান্সফার প্রোটোকল (এইচটিটিপি) শিরোলেখ ক্ষেত্রের পরামিতিগুলির জন্য অক্ষর সেট এবং ভাষা এনকোডিং" - ব্রাউজার টেস্টিংয়ের লিঙ্ক এবং পিছনের সামঞ্জস্য সহ এ সম্পর্কিত আলোচনা রয়েছে "

আরএফসি 2183 ইঙ্গিত করে যে এই জাতীয় শিরোনামগুলি আরএফসি 2184 অনুসারে এনকোড করা উচিত , যা উপরের খসড়া আরএফসি দ্বারা আচ্ছাদিত আরএফসি 2231 দ্বারা অচল করা হয়েছিল ।


5
আরও মনে রাখবেন যে ইন্টারনেট খসড়া ("খসড়া আরএফসি" নয়) শেষ হয়ে গেছে, এবং চূড়ান্ত নথিটি আরএফসি 5987 ( গ্রিনবিটস.ডি / টেক / ওয়েবেডাভ / আরএফসি 5987.html )
জুলিয়ান রেশকে

11
এর সাথে সম্পর্কিত, আমি আবিষ্কার করেছি যে ফায়ারফক্স (সংস্করণ 4-9 অন্তর্ভুক্ত) ফাইলের নেমে একটি কমা (,) রয়েছে কিনা, যেমন Content-Disposition: filename="foo, bar.pdf"। ফলস্বরূপ ফায়ারফক্স ফাইলটি সঠিকভাবে ডাউনলোড করে তবে .partএক্সটেনশনটি রাখে (উদাঃ foo,bar.pdf-1.part)। তারপরে, অবশ্যই ফাইলটি সঠিকভাবে খুলবে না কারণ অ্যাপ্লিকেশনটির সাথে সম্পর্কিত নয় .part। অন্যান্য ASCII অক্ষর ঠিক আছে বলে মনে হচ্ছে।
ক্যাচডেভ

3
আইই আচরণ সম্পর্কে আরও তথ্যের জন্য, ব্লগগুলি
b/

5
@ ক্যাচডেভ: আপনি "সংযুক্তি" ভুলে গেছেন; অংশ।
ক্রিস্টোফার হামারস্ট্রিম

6
সব মিলিয়ে, এটি 74 টি আপভোটের সাথে একটি লিঙ্ক-কেবল উত্তর ছাড়া আর কিছুই নয়।
এন্টি হাপাল

364

আমি জানি এটি একটি পুরানো পোস্ট তবে এটি এখনও খুব প্রাসঙ্গিক। আমি খুঁজে পেয়েছি যে আধুনিক ব্রাউজারগুলি 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ুকভস্কি: কেন জানি না তবে কানেক্টে আলোচিত হিসাবে মনে হচ্ছে এটি মারাত্মকভাবে কাজ করবে না।


1
এটি মোবাইল সাফারি (উপরে বর্ণিত কাঁচা utf-8) এর জন্য কাজ করে পেয়েছেন তবে এটি একই ডিভাইস থেকে গুডরিডারের পক্ষে কাজ করে না। কোন ধারনা?
থিলো

1
আই 7 এবং 8 এর জন্য অ্যাডাস্ট্রোফেসের পালানো দরকার: প্রতিস্থাপন ("'", উরি.হেক্সেক্সটপ (' \ ''))
টমজ

1
সরাসরি ইউটিএফ -8 অক্ষর লিখলে মনে হয় ফায়ারফক্স, ক্রোম এবং অপেরার বর্তমান সংস্করণগুলির জন্য কাজ করবে। সাফারি ও আইই পরীক্ষা করে নি।
মার্টিন টর্নয়েজ

20
কেন তাদের একত্রিত করবেন না Content-Disposition: attachment; filename*=UTF-8''Na%C3%AFve%20file.txt; filename=Na%C3%AFve%20file.txtএবং ব্রাউজার স্নিফিং এড়িয়ে যান? কাজ করবে?
ডেভ ভ্যান ডেন এয়েণ্ডে

9
ফাস্টমেইলে সদয় লোকেরা আর একটি কাজ খুঁজে পেয়েছিল: ব্লগ.ফেসমেইল ডটকম / ২০১/0 / ০24 / ২৪ / ডাউনলোড - অন - ইজলিশ- ফাইলের নামসমূহ সামগ্রী-স্বভাব: সংযুক্তি; ফাইলের নাম = "foo-% C3% a4.html"; ফাইলের নাম * = UTF-8''foo-% c3% a4.html ফাইলের নাম দু'বার উল্লেখ করা (একসময় ইউটিএফ -8 উপসর্গ ছাড়া এবং একবারে এর সাথে) এটি আইই 8-11, এজ, ক্রোম, ফায়ারফক্স এবং সাফারিতে কাজ করে ( আপেল স্থির সাফারি মত মনে হচ্ছে, সুতরাং এটি এখন সেখানে কাজ করে)
wullinkm

169

একটি সহজ এবং অত্যন্ত শক্তিশালী বিকল্প রয়েছে: একটি ইউআরএল ব্যবহার করুন যা আপনার পছন্দসই ফাইল নাম ধারণ করে

শেষ স্ল্যাশের পরে যখন নামটি আপনি চান তখন আপনার কোনও অতিরিক্ত শিরোনামের প্রয়োজন হয় না!

এই কৌশলটি কাজ করে:

/real_script.php/fake_filename.doc

এবং যদি আপনার সার্ভার ইউআরএল পুনর্লিখনকে সমর্থন করে (যেমন mod_rewriteঅ্যাপাচিতে) তবে আপনি স্ক্রিপ্ট অংশটি পুরোপুরি আড়াল করতে পারেন।

ইউআরএল-এর অক্ষরগুলি ইউটিএফ -8-এ থাকতে হবে, বাই-বাই-বাই বুক চাপানো উচিত:

/mot%C3%B6rhead   # motörhead

3
GetAttachment.aspx / নকল_প্লেষন.ডোক? আইডি = 34 (যদিও এটি কেবল অ্যাপাচি-র উদ্বিগ্ন হতে পারে)
কর্নেল

2
এটি একটি চমত্কার সমাধান; সত্যিই আমাকে অনেক সাহায্য করেছে। ধন্যবাদ।
ক্রিস্টোপলাস

6
আমি খরগোশের ট্রেইলে নেমে গিয়ে কয়েকটি সমাধানের চেষ্টা করেছি; শিরোনামগুলি সঠিকভাবে সেট করার জন্য সঠিক ব্রাউজার এবং সংস্করণটি স্নেফ করার চেষ্টা করা খুব দুঃস্বপ্ন of ক্রোম ভুলভাবে সাফারি হিসাবে চিহ্নিত করছে যা একেবারেই একই রকম আচরণ করে না (সঠিকভাবে এনকোড করা না থাকলে কমাতে বিরতি দেয়)। নিজেকে ঝামেলা বাঁচান, এই সমাধানটি ব্যবহার করুন এবং প্রয়োজন হিসাবে ইউআরএলটি নাম দিন।
এমপেন

3
/:id/:filenameপদ্ধতি অত্যন্ত সহজ এবং কাজ, আপনাকে ধন্যবাদ!
লুকা স্টেব

2
হাজার বার "হ্যাঁ"। আপনি এই সঙ্গে গুরুত্ব সহকারে সময় জিততে হবে। আরো এমনকি - কিছু Android ব্রাউজার ফ্ল্যাট আউট হবে উপেক্ষাContent-Disposition এবং (তারা তোমার পথ থেকে উত্পন্ন হবে না) পরিবর্তে খুব আকর্ষণীয় ফাইলের নামের তৈরি করুন। সুতরাং নিজের Content-Disposition: attachment
স্বাচ্ছন্দ্য

73

আরএফসি 6266 " হাইপারটেক্সট ট্রান্সফার প্রোটোকল (এইচটিটিপি) মধ্যে সামগ্রী-বিশৃঙ্খলা শিরোনাম ক্ষেত্রের ব্যবহার " বর্ণনা করে । এ থেকে উদ্ধৃতি:

International. আন্তর্জাতিকীকরণ বিবেচনা

" filename*" পরামিতি ( বিভাগ 4.3 ), [ আরএফসি 5987 ] এ সংজ্ঞায়িত এনকোডিং ব্যবহার করে সার্ভারকে আইএসও -8859-1 অক্ষরের বাইরে অক্ষর প্রেরণ করতে, এবং বিকল্পভাবে ব্যবহারের ক্ষেত্রে ভাষা নির্দিষ্ট করার অনুমতি দেয়।

এবং তাদের উদাহরণ বিভাগে :

এই উদাহরণটি উপরের মত একই, তবে আরএফসি 5987 প্রয়োগ করে না এমন ব্যবহারকারী এজেন্টগুলির সাথে সামঞ্জস্যের জন্য "ফাইলের নাম" পরামিতি যুক্ত :

Content-Disposition: attachment;
                     filename="EURO rates";
                     filename*=utf-8''%e2%82%ac%20rates

দ্রষ্টব্য: যে ব্যবহারকারী এজেন্টগুলি আরএফসি 5987 এনকোডিং সমর্থন করে না তারা " filename*" এর পরে যখন ঘটে তখন " " এড়িয়ে যান filename

ইন পরিশিষ্ট D এছাড়াও আছে বৃদ্ধি ইনটেরোপিরাবিলিটি পরামর্শ একটি দীর্ঘ তালিকা রয়েছে। এটি এমন একটি সাইটেও নির্দেশ করে যা বাস্তবায়নগুলির সাথে তুলনা করে । সাধারণ ফাইলের নামের জন্য উপযুক্ত সর্বমোট পরীক্ষার মধ্যে রয়েছে:

  • attwithisofnplain : ডাবল উদ্ধৃতি সহ এবং এনকোডিং ছাড়াই প্লেইন আইএসও -8859-1 ফাইলের নাম। এর জন্য একটি ফাইলের নাম প্রয়োজন যা সমস্ত আইএসও -8859-1 হয় এবং এতে শতকরা চিহ্ন থাকে না, হেক্স ডিজিটের সামনে অন্তত নয়।
  • attfnboth : উপরে বর্ণিত ক্রমে দুটি পরামিতি। বেশিরভাগ ব্রাউজারে বেশিরভাগ ফাইলের নামের জন্য কাজ করা উচিত, যদিও আইই 8 filename" " "পরামিতিটি ব্যবহার করবে ।

সেই আরএফসি 5987 ঘুরে আরএফসি 2231 উল্লেখ করে , যা প্রকৃত ফর্ম্যাটটি বর্ণনা করে। 2231 প্রাথমিকভাবে মেলের জন্য এবং 5987 আমাদের জানায় যে এইচটিটিপি শিরোনামগুলির জন্য কী কী অংশ ব্যবহার করা যেতে পারে। multipart/form-dataএইচটিটিপি বডির অভ্যন্তরে ব্যবহৃত মাইমির শিরোনামগুলিকে বিভ্রান্ত করবেন না , যা আরএফসি 2388 ( বিশেষত বিভাগে 4.4 ) এবং এইচটিএমএল 5 খসড়া দ্বারা পরিচালিত হয় ।


1
সাফারিতে আমার সমস্যা হয়েছিল। রাশিয়ান নামের ফাইলগুলি ডাউনলোড করার সময় ভ্রান্ত এবং অপঠনযোগ্য অক্ষর প্রাপ্ত হয়েছিল। সমাধান সাহায্য করেছে। তবে আমাদের একটি একক সারিতে হেডার পাঠাতে হবে (!!!)।
evtuhovdo

16

জিম তার উত্তরে উল্লিখিত খসড়া আরএফসি থেকে লিঙ্কিত নিম্নোক্ত নথিটি আরও প্রশ্নের উত্তর দেয় এবং অবশ্যই এখানে প্রত্যক্ষ নোটের মূল্য দেয়:

এইচটিটিপি বিষয়বস্তু-বিশৃঙ্খলা শিরোনাম এবং আরএফসি 2231/2047 এনকোডিংয়ের জন্য পরীক্ষার ক্ষেত্রে


নোট করুন যে কেউ ফাইলনামের প্যারামিটারকে এনকোড করার উভয় পদ্ধতি সরবরাহ করতে পারে এবং তারা পুরানো ব্রাউজার এবং নতুন ব্রাউজারগুলির সাথে (পুরানো এমএসআইই 8 এবং সাফারি এক্ষেত্রে) সঠিকভাবে কাজ করছে বলে মনে হচ্ছে। @ আতিফআজিয উল্লিখিত প্রতিবেদনে অ্যাটফনবোথ পরীক্ষা করুন ।
পাবলো মন্টিল্লা

11

এসপ নেটওয়্যার এমভিসি 2 তে আমি এরকম কিছু ব্যবহার করি:

return File(
    tempFile
    , "application/octet-stream"
    , HttpUtility.UrlPathEncode(fileName)
    );

আমার ধারণা আপনি যদি এমভিসি (2) ব্যবহার না করেন তবে আপনি কেবল ফাইলের নাম ব্যবহার করে এনকোড করতে পারেন

HttpUtility.UrlPathEncode(fileName)

2
ফাইলের নাম এনকোডিংয়ের জন্য ইউআরএল এনকোডিং বৈধ নয়, ব্রাউজারগুলিকে সেগুলি url ডিকোড করা উচিত নয়।
সিরিয়ালসেব

IE 11 অবশ্যই এই ক্ষেত্রে url এনকোডিং ডিকোড করে না।
সিউডোকোডার

তবে ব্রাউজারটি ক্রোম বা আইই, এফএফ, সাফারি এবং অপেরা হিসাবে অন্যরা এনকোডিংয়ের সাথে ঠিকঠাক কাজ করার সময় এটির urlCoded হওয়া দরকার
রেজা

10

আমি এনকোডিং করার জন্য নিচের কোডটি স্নিপেট ব্যবহার করুন (অভিমানী fileName : test.txt ফাইলের নাম এবং ফাইলের এক্সটেনশন, অর্থাত রয়েছে):


পিএইচপি:

if ( strpos ( $_SERVER [ 'HTTP_USER_AGENT' ], "MSIE" ) > 0 )
{
     header ( 'Content-Disposition: attachment; filename="' . rawurlencode ( $fileName ) . '"' );
}
else
{
     header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode ( $fileName ) );
}

জাভা:

fileName = request.getHeader ( "user-agent" ).contains ( "MSIE" ) ? URLEncoder.encode ( fileName, "utf-8") : MimeUtility.encodeWord ( fileName );
response.setHeader ( "Content-disposition", "attachment; filename=\"" + fileName + "\"");

ঠিক আছে, এটা করা উচিত rawurlencodeজন্য অন্তত পিএইচপি filename*=স্বভাব হেডার থেকে value-charsব্যবহৃত ext-valueবোঝায় যা RFC 6266- এর> বোঝায় যা RFC 5987 (দেখুন tools.ietf.org/html/rfc6266#section-4.1 & tools.ietf.org/html/rfc5987#section -৩.২.১ ) শতাংশ অব্যাহতি ছাড়াই স্থানের অনুমতি দেয় না ( filename=অন্যদিকে, মনে হচ্ছে এটি কেবল এএসসিআইআই উপস্থিত থাকা সত্ত্বেও পলায়ন ছাড়াই কোনও স্থানের অনুমতি দিতে পারে)। কাঁচাবার্নকোডের সম্পূর্ণ কঠোরতার সাথে এনকোড করা প্রয়োজন হয় না, তাই কয়েকটি অক্ষর অনস্কেপ করা যায়
ব্রেট জমির

10

ফাইলের নামটি ডাবল উদ্ধৃতিতে রাখুন। আমার জন্য সমস্যা সমাধান। এটার মত:

Content-Disposition: attachment; filename="My Report.doc"

http://kb.mozillazine.org/Filenames_with_spaces_are_truncated_upon_download

আমি একাধিক বিকল্প পরীক্ষা করেছি। ব্রাউজারগুলি চশমাগুলিকে সমর্থন করে না এবং আলাদাভাবে কাজ করে না, আমি বিশ্বাস করি যে ডাবল কোটই সেরা বিকল্প।


3
এটি দুঃখের সাথে উপরের উত্তরে বর্ণিত সমস্ত সমস্যার সমাধান করে না।
লুকা স্টেব

2
এই আপনি, স্পেস দিয়ে একটি ফাইলের নাম আসতে অনুমতি দেবে &, %, #ইত্যাদি সুতরাং এটি যে solves।
ডন

যদি ফাইলনামে ডাবল কোট থাকে (হ্যাঁ এটি হতে পারে), আরএফসি 6266-তে উল্লিখিত হিসাবে, ফাইলের নামটি একটি "কোটড-স্ট্রিং", এবং আরএফসি 2616-তে উল্লিখিত হিসাবে কোটড-স্ট্রিংয়ের মধ্যে ডাবল কোটগুলিকে ব্যাকস্ল্যাশ দিয়ে এড়িয়ে যাওয়া উচিত।
ক্রিস্টোফ রাউসি

9

এএসপি.নেট ওয়েব এপিআইতে, আমি url ফাইলের নামটি এনকোড করেছি:

public static class HttpRequestMessageExtensions
{
    public static HttpResponseMessage CreateFileResponse(this HttpRequestMessage request, byte[] data, string filename, string mediaType)
    {
        HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
        var stream = new MemoryStream(data);
        stream.Position = 0;

        response.Content = new StreamContent(stream);

        response.Content.Headers.ContentType = 
            new MediaTypeHeaderValue(mediaType);

        // URL-Encode filename
        // Fixes behavior in IE, that filenames with non US-ASCII characters
        // stay correct (not "_utf-8_.......=_=").
        var encodedFilename = HttpUtility.UrlEncode(filename, Encoding.UTF8);

        response.Content.Headers.ContentDisposition =
            new ContentDispositionHeaderValue("attachment") { FileName = encodedFilename };
        return response;
    }
}

IE 9 স্থির নয়
আইই 9 স্থির


5

আমি পুরানো এক্সপ্লোরার (সামঞ্জস্যতা মোডের মাধ্যমে) সহ সমস্ত বড় ব্রাউজারগুলিতে নিম্নলিখিত কোডটি পরীক্ষা করেছি এবং এটি সর্বত্র ভালভাবে কাজ করে:

$filename = $_GET['file']; //this string from $_GET is already decoded
if (strstr($_SERVER['HTTP_USER_AGENT'],"MSIE"))
  $filename = rawurlencode($filename);
header('Content-Disposition: attachment; filename="'.$filename.'"');

5

আমি আমার "ডাউনলোড. php " স্ক্রিপ্টে এই কোডটি শেষ করেছি ( এই ব্লগপোস্ট এবং এই পরীক্ষাগুলির উপর ভিত্তি করে )।

$il1_filename = utf8_decode($filename);
$to_underscore = "\"\\#*;:|<>/?";
$safe_filename = strtr($il1_filename, $to_underscore, str_repeat("_", strlen($to_underscore)));

header("Content-Disposition: attachment; filename=\"$safe_filename\""
.( $safe_filename === $filename ? "" : "; filename*=UTF-8''".rawurlencode($filename) ));

এটি ফাইলনামের স্ট্যান্ডার্ড পদ্ধতিটি = "..." ব্যবহার করে যতক্ষণ না কেবল ইসো-ল্যাটিন 1 এবং "নিরাপদ" অক্ষর ব্যবহৃত হয়; যদি তা না হয় তবে এটি ফাইলের নাম * = UTF-8 '' ইউআরএল-এনকোডেড যুক্ত করে। এই নির্দিষ্ট পরীক্ষার কেস অনুসারে , এটি এমএসআইই 9 থেকে আপ করা উচিত এবং সাম্প্রতিক এফএফ, ক্রোম, সাফারি; নিম্ন MSIE সংস্করণে, এটি ফাইলের নামের ISO8859-1 সংস্করণ সম্বলিত ফাইলের নাম দেওয়া উচিত, এই এনকোডিং-এ নয় এমন অক্ষরের উপর আন্ডারস্কোর রয়েছে।

চূড়ান্ত দ্রষ্টব্য: সর্বাধিক প্রতিটি শিরোলেখের ক্ষেত্রের আকার অ্যাপাচে 8190 বাইট tes ইউটিএফ -8 চরিত্র অনুসারে চার বাইট পর্যন্ত হতে পারে; Rawurlencode এর পরে, এটি প্রতিটি চরিত্রের জন্য x3 = 12 বাইট। অত্যন্ত অদক্ষ, তবে ফাইলনামে 600 টিরও বেশি "হাসি"% F0% 9F% 98% 81 থাকা তাত্ত্বিকভাবে এখনও হওয়া উচিত।


... তবে সর্বোচ্চ স্থানান্তরযোগ্য ফাইলের নাম দৈর্ঘ্যও ক্লায়েন্টের উপর নির্ভর করে depends সবেমাত্র পাওয়া গেছে যে সর্বাধিক [89 হাসি] .পিডিএফ ফাইলের নাম এমএসআইই 11 এর মাধ্যমে পায়। ফায়ারফক্স 37 এ এটি সর্বাধিক [111x 😁] .pdf is Chrome41 110 তম হাসিতে ফাইলের নামটি কেটে দেয়। মজার বিষয় হল, প্রত্যয়টি ঠিক স্থানান্তরিত হয়েছে।
অপুরকৃত

5

আপনি যদি নোডেজ ব্যাকএন্ড ব্যবহার করছেন তবে নীচের কোডটি আমি খুঁজে পেয়েছি এখানে

var fileName = 'my file(2).txt';
var header = "Content-Disposition: attachment; filename*=UTF-8''" 
             + encodeRFC5987ValueChars(fileName);

function encodeRFC5987ValueChars (str) {
    return encodeURIComponent(str).
        // Note that although RFC3986 reserves "!", RFC5987 does not,
        // so we do not need to escape it
        replace(/['()]/g, escape). // i.e., %27 %28 %29
        replace(/\*/g, '%2A').
            // The following are not required for percent-encoding per RFC5987, 
            // so we can allow for a little better readability over the wire: |`^
            replace(/%(?:7C|60|5E)/g, unescape);
}

1
ব্যবহার করা ভাল encodeURI(str)। যেমন ফাইলের নামের তারিখগুলির সাথে উদাহরণস্বরূপ: encodeURIComponent('"Kornél Kovács 1/1/2016')=> "কর্নেল কোভিকস 1% 2F1% 2F2016" বনাম। encodeURI('"Kornél Kovács 1/1/2016')=> "কর্নেল কোভিকস 1/1/2016"
gdibble

4

পিএইচপি-তে এটি আমার জন্য করেছে (ধরে নিলেন ফাইলের নামটি ইউটিএফ 8 এনকোডযুক্ত রয়েছে):

header('Content-Disposition: attachment;'
    . 'filename="' . addslashes(utf8_decode($filename)) . '";'
    . 'filename*=utf-8\'\'' . rawurlencode($filename));

IE8-11, ফায়ারফক্স এবং ক্রমের বিরুদ্ধে পরীক্ষিত।
ব্রাউজার যদি ফাইলের নাম * = utf-8 ব্যাখ্যা করতে পারে তবে এটি ফাইলের ইউটিএফ 8 সংস্করণ ব্যবহার করবে, অন্যথায় এটি ডিকোডেড ফাইলের নাম ব্যবহার করবে। যদি আপনার ফাইলের নামগুলিতে এমন অক্ষর রয়েছে যা আইএসও -8859-1-তে উপস্থাপন করা যায় না তবে আপনি iconvপরিবর্তে এটি ব্যবহার করতে পারেন ।


3
যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কেন এবং / অথবা এটি কীভাবে প্রশ্নের উত্তর দেয় সে সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করে এর দীর্ঘমেয়াদী মানকে উল্লেখযোগ্যভাবে উন্নতি করবে। দয়া করে সম্পাদনা কিছু ব্যাখ্যা যোগ করার জন্য আপনার উত্তর।
টবি স্পিড

2
ওহো, উপরের কোড-উত্তরগুলির মধ্যে কোনও উত্তরই এর চেয়ে কম বা সমালোচিত হয়নি। এছাড়াও আমি খুঁজে পেয়েছি কেন ইতিমধ্যে যথেষ্ট উত্তর দেওয়া হয়েছিল: IE ফাইলের নাম * = utf-8 ব্যাখ্যা করে না তবে ফাইলের নামের ISO8859-1 সংস্করণ প্রয়োজন যা এই স্ক্রিপ্টটি দেয়। কেবল অলসকে পিএইচপি করার জন্য একটি কার্যকর সাধারণ কোড দিতে চেয়েছিলেন।
গুস্তাভ

আমি মনে করি এটি হ্রাস পেয়েছে কারণ প্রশ্নটি ভাষা নির্দিষ্ট নয় তবে শিরোনামের এনকোডিংটি প্রয়োগ করার সময় আরএফসি-র কী আঁকড়ে থাকবে সে সম্পর্কে। তবে ধন্যবাদ, এই উত্তরের জন্য, পিএইচপি-র জন্য, এই কোডটি আমার দুর্দশাগুলি দূর করে দিয়েছে।
j4k3

ধন্যবাদ. এই উত্তরটি সম্ভবত প্রশ্নের জবাব দিতে পারে নি, তবে এটি ঠিক আমি যা খুঁজছিলাম এবং পাইথনের সমস্যা সমাধানে আমাকে সহায়তা করেছিল।
ল্যান্ডসি সাইমন

1
আমি নিশ্চিত যে ব্যবহারকারী যদি ফাইলটির নাম নিয়ন্ত্রণ করতে পারেন তবে এই কোডটি আক্রমণ আক্রমণকারী হিসাবে ব্যবহার করা যেতে পারে pretty
অ্যান্টি হাপাল

3

গ্রাহক সমস্যার প্রতিক্রিয়া হিসাবে আমি আজ এই সমস্ত জিনিসটি চেষ্টা করছিলাম তখন থেকে একটি আপডেট

  • জাপানিদের জন্য সাফারি কনফিগার করা ব্যতীত, আমাদের গ্রাহকরা পরীক্ষিত সমস্ত ব্রাউজারগুলি ফাইলের নাম = টেক্সট.পিডিএফ দিয়ে সেরা কাজ করেছে - যেখানে টেক্সট এমন একটি গ্রাহক মূল্য যা ইউএসএল এনকোডিং ছাড়াই utf-8 এএসপি. নেট / আইআইএস দ্বারা ক্রমিক করা হয়। কোনও কারণে, ইংরেজির জন্য কনফিগার করা সাফারি utf-8 জাপানি নামের একটি ফাইল গ্রহণ করতে এবং সঠিকভাবে সংরক্ষণ করতে পারে তবে জাপানের জন্য কনফিগার করা একই ব্রাউজারটি utf-8 অক্ষরের ব্যাখ্যা ছাড়াই ফাইলটি সংরক্ষণ করতে পারে। পরীক্ষিত অন্যান্য সমস্ত ব্রাউজারগুলি ইউআরএল এনকোডিং ছাড়াই utf-8 এনকোডযুক্ত ফাইলের নামটি দিয়ে / ভাষা (ভাষা বিন্যাস নির্বিশেষে) সর্বোত্তম / সূক্ষ্ম কাজ করবে বলে মনে হয়েছিল।
  • আমি একটি একক ব্রাউজার Rfc5987 / 8187 বাস্তবায়নের খুঁজে পাইনি এ সব । আমি সর্বশেষতম ক্রোম দিয়ে পরীক্ষা করেছি, ফায়ারফক্স প্লাস আইই 11 এবং এজ তৈরি করে। আমি কেবল ফাইলের নাম * = utf-8''texturlencoded.pdf দিয়ে হেডারটি সেট করার চেষ্টা করেছি, ফাইলনাম = পাঠ্য.পিডিএফ উভয় দিয়েই সেট করেছি; ফাইলের নাম * = UTF-8''texturlencoded.pdf। উপরের যে কোনও একটিতে Rfc5987 / 8187 এর কোনও বৈশিষ্ট্যই সঠিকভাবে প্রক্রিয়াজাত হতে দেখা যায়নি।

এটি একটি ভাল আপডেট। আপনি যে নির্দিষ্ট পরীক্ষাগুলির চেষ্টা করেছেন তা কি বিশদভাবে বলতে পারেন?
ব্র্যাড

3

পিএইচপি ফ্রেমওয়ার্ক Symfony 4 হয়েছে $filenameFallbackHeaderUtils::makeDisposition । আপনি বিশদ জন্য এই ফাংশন সন্ধান করতে পারেন - এটি উপরের উত্তর অনুরূপ।

ব্যবহারের উদাহরণ:

$filenameFallback = preg_replace('#^.*\.#', md5($filename) . '.', $filename);
$disposition = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, $filename, $filenameFallback);
$response->headers->set('Content-Disposition', $disposition);

1

ক্লাসিক এএসপি সলিউশন

এটি অত্যাধুনিক ব্রাউজারে ক্ষণস্থায়ী সমর্থন Filenameযেমন UTF-8এখন কিন্তু একটি ফাইল আপলোড সমাধান আমি ব্যবহারের উপর ভিত্তি করে ছিল ক্ষেত্রে ছিল FreeASPUpload.Net (লিংক পয়েন্ট সাইটটি আর, বিদ্যমান archive.org ) এটি পার্সিং কাজ না would বাইনারি একক বাইট ASCII এনকোডযুক্ত স্ট্রিং পড়ার উপর নির্ভর করে, যা আপনি UTF-8 এনকোডড ডেটা পাস করার পরে ভাল কাজ করেছিল যতক্ষণ না আপনি ASCII অক্ষরগুলি না পেয়ে সমর্থন করেন না।

তবে আমি বাইনারিটি ইউটিএফ -8 হিসাবে পড়ার এবং পার্স করার কোডটি পেতে একটি সমাধান খুঁজে পেতে সক্ষম হয়েছি।

Public Function BytesToString(bytes)    'UTF-8..
  Dim bslen
  Dim i, k , N 
  Dim b , count 
  Dim str

  bslen = LenB(bytes)
  str=""

  i = 0
  Do While i < bslen
    b = AscB(MidB(bytes,i+1,1))

    If (b And &HFC) = &HFC Then
      count = 6
      N = b And &H1
    ElseIf (b And &HF8) = &HF8 Then
      count = 5
      N = b And &H3
    ElseIf (b And &HF0) = &HF0 Then
      count = 4
      N = b And &H7
    ElseIf (b And &HE0) = &HE0 Then
      count = 3
      N = b And &HF
    ElseIf (b And &HC0) = &HC0 Then
      count = 2
      N = b And &H1F
    Else
      count = 1
      str = str & Chr(b)
    End If

    If i + count - 1 > bslen Then
      str = str&"?"
      Exit Do
    End If

    If count>1 then
      For k = 1 To count - 1
        b = AscB(MidB(bytes,i+k+1,1))
        N = N * &H40 + (b And &H3F)
      Next
      str = str & ChrW(N)
    End If
    i = i + count
  Loop

  BytesToString = str
End Function

ক্রেডিট আমার নিজের কোড থেকে ফাংশনটি প্রয়োগ করে খাঁটি এএসপি ফাইল আপলোডে যায় আমি ফাইলের নামগুলি কাজ করতে সক্ষম হয়েছি ।BytesToString()include_aspuploader.aspUTF-8


উপকারী সংজুক


-1

ওয়েব অ্যাপ্লিকেশনে আমাদের একই সমস্যা ছিল এবং HTML থেকে ফাইলের <input type="file">নামটি পড়ে এবং একটি নতুন এইচটিএমএলতে ইউআরএল-এনকোডযুক্ত ফর্মটি সেট করে শেষ হয়েছিল ended<input type="hidden"> । অবশ্যই আমাদের "সি: \ নকলপথ \" এর মতো পথটি সরিয়ে ফেলতে হয়েছিল যা কিছু ব্রাউজার দ্বারা ফিরে আসে।

অবশ্যই এটি ওপিএস প্রশ্নের সরাসরি উত্তর দেয় না, তবে এটি অন্যদের জন্য সমাধান হতে পারে।


1
সম্পূর্ণ আলাদা ইস্যু। প্রশ্নটি ডাউনলোড করার বিষয়ে, আপনার উত্তরটি আপলোড সম্পর্কে ।
ওসকার বার্গগ্রেন

-3

আমি সাধারণত ফাইল-নামগুলি (% xx সহ) ইউআরএল-এনকোড করি এবং মনে হয় এটি সমস্ত ব্রাউজারে কাজ করে। আপনি যাইহোক কিছু পরীক্ষা করতে চাইবেন।


10
আমি কয়েকটিতে পরীক্ষা দিয়েছি এবং এটি সমস্ত ব্রাউজারে সেভাবে কাজ করে না, এইভাবে প্রশ্ন। :)
আতিফ আজিজ 15
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.