আমি এএসপি.নেট এমভিসির ব্যবহারকারীদের কাছে একটি ডাটাবেসে সঞ্চিত ফাইলগুলি প্রেরণে সমস্যার মুখোমুখি হচ্ছি। আমি যা চাই তা হল দুটি লিঙ্কের তালিকা প্রদর্শন করা একটি, ফাইলটি দেখার জন্য এবং ব্রাউজারে প্রেরিত মাইমটাইপটিকে কীভাবে পরিচালনা করা উচিত তা নির্ধারণ করতে দেওয়া এবং অন্যটি কোনও ডাউনলোডকে বাধ্য করার জন্য।
যদি আমি কোনও ফাইল বলে মনে করি SomeRandomFile.bak
এবং এই ধরণের ফাইলগুলি খুলতে ব্রাউজারের কোনও সম্পর্কিত প্রোগ্রাম না থাকে তবে ডাউনলোড আচরণের সাথে এটি ডিফল্ট হয়ে গেলে আমার কোনও সমস্যা নেই। তবে, যদি আমি কোনও ফাইল বলা বাছাই করতে চাই SomeRandomFile.pdf
বা SomeRandomFile.jpg
আমি ফাইলটি কেবল খোলার চাই। তবে আমি ডাউনলোডের লিঙ্কটি পাশাপাশি রাখতে চাই যাতে ফাইল ডাউনলোডের ধরণের নির্বিশেষে আমি কোনও ডাউনলোড প্রম্পটকে বাধ্য করতে পারি। এটা কোনো কিছু হলো?
আমি চেষ্টা করেছি FileStreamResult
এবং এটি বেশিরভাগ ফাইলের জন্য কাজ করে, এর নির্মাতা ডিফল্টরূপে কোনও ফাইলের নাম গ্রহণ করে না, সুতরাং অজানা ফাইলগুলিকে URL এর ভিত্তিতে একটি ফাইল নাম বরাদ্দ করা হয় (যা সামগ্রীর ধরণের উপর ভিত্তি করে দিতে এক্সটেনশনটি জানেন না)। আমি যদি ফাইলটির নাম উল্লেখ করে জোর করে বলি তবে আমি ব্রাউজারের জন্য সরাসরি ফাইলটি খোলার ক্ষমতা হারাতে পারি এবং আমি ডাউনলোডের প্রম্পট পাই। অন্য কেউ ইহার সম্মুখীন হয়েছে?
এগুলি আমি এ পর্যন্ত যা চেষ্টা করেছি তার উদাহরণ।
//Gives me a download prompt.
return File(document.Data, document.ContentType, document.Name);
//Opens if it is a known extension type, downloads otherwise (download has bogus name and missing extension)
return new FileStreamResult(new MemoryStream(document.Data), document.ContentType);
//Gives me a download prompt (lose the ability to open by default if known type)
return new FileStreamResult(new MemoryStream(document.Data), document.ContentType) {FileDownloadName = document.Name};
কোন পরামর্শ?
আপডেট:
এই প্রশ্নগুলি অনেক লোকের সাথে জড়বস্তু বলে মনে হচ্ছে, তাই আমি ভেবেছিলাম একটি আপডেট পোস্ট করব। আন্তর্জাতিক চরিত্রগুলি সম্পর্কে ওসকার যে নীচের স্বীকৃত উত্তরের উপর সতর্কবার্তাটি সম্পূর্ণভাবে বৈধ এবং আমি ContentDisposition
ক্লাসটি ব্যবহারের কারণে কয়েকবার এটিকে আঘাত করেছি । আমি ঠিক করার পরে আমার বাস্তবায়ন আপডেট করেছি। নীচের কোডটি আমার একটি এএসপি.নেট কোর (পূর্ণ ফ্রেমওয়ার্ক) অ্যাপ্লিকেশনটিতে আমার সাম্প্রতিকতম অবতারের থেকে হলেও, আমি System.Net.Http.Headers.ContentDispositionHeaderValue
ক্লাসটি ব্যবহার করছি বলে এটি পুরানো এমভিসি অ্যাপ্লিকেশনটিতে ন্যূনতম পরিবর্তনগুলি সহ কাজ করা উচিত ।
using System.Net.Http.Headers;
public IActionResult Download()
{
Document document = ... //Obtain document from database context
//"attachment" means always prompt the user to download
//"inline" means let the browser try and handle it
var cd = new ContentDispositionHeaderValue("attachment")
{
FileNameStar = document.FileName
};
Response.Headers.Add(HeaderNames.ContentDisposition, cd.ToString());
return File(document.Data, document.ContentType);
}
// an entity class for the document in my database
public class Document
{
public string FileName { get; set; }
public string ContentType { get; set; }
public byte[] Data { get; set; }
//Other properties left out for brevity
}