আপনি এজেএক্স কলের মাধ্যমে ডাউনলোডের জন্য সরাসরি কোনও ফাইল ফেরত দিতে পারবেন না, তাই আপনার সার্ভারে সম্পর্কিত ডেটা পোস্ট করার জন্য একটি এজ্যাক্স কল ব্যবহার করার বিকল্প বিকল্প approach এরপরে আপনি এক্সেল ফাইল তৈরি করতে সার্ভার সাইড কোড ব্যবহার করতে পারেন (আমি এর জন্য ইপিপ্লাস বা এনপিওআই ব্যবহার করার পরামর্শ দেব যদিও এটি মনে হচ্ছে আপনার এই অংশটি কাজ করছে)।
সেপ্টেম্বর 2016 আপডেট করুন
আমার আসল উত্তরটি (নীচে) 3 বছরের বেশি বয়সী ছিল, তাই আমি ভেবেছিলাম যে আমি আপডেট করব কারণ এজেএক্স এর মাধ্যমে ফাইলগুলি ডাউনলোড করার সময় আমি সার্ভারে আর ফাইল তৈরি করব না, যদিও মূল উত্তরটি এখনও রেখেছি কারণ এটি নির্ভর করে এখনও কিছু ব্যবহার হতে পারে আপনার নির্দিষ্ট প্রয়োজনীয়তা।
আমার এমভিসি অ্যাপ্লিকেশনগুলির একটি সাধারণ পরিস্থিতি এমন একটি ওয়েব পৃষ্ঠার মাধ্যমে প্রতিবেদন করছে যা কিছু ব্যবহারকারীর কনফিগার করা রিপোর্টের পরামিতি (তারিখের সীমা, ফিল্টার ইত্যাদি) রয়েছে। যখন ব্যবহারকারীরা সেগুলিতে সেগুলি প্যারামিটারগুলি নির্দিষ্ট করে থাকেন, তখন প্রতিবেদনটি উত্পন্ন হয় (উদাহরণস্বরূপ কোনও এক্সেল ফাইল আউটপুট হিসাবে বলে) এবং তারপরে আমি ফলাফলটি ফাইলটিকে TempData
একটি অনন্য রেফারেন্স সহ বালতিতে বাইট অ্যারে হিসাবে সংরক্ষণ করি । এই রেফারেন্সটি আমার এজেএক্স ফাংশনের জসন ফলাফল হিসাবে ফিরে পেয়েছে যা পরবর্তী সময়ে ডেটা বের TempData
করতে এবং শেষ ব্যবহারকারী ব্রাউজারে ডাউনলোড করতে পৃথক নিয়ন্ত্রক পদক্ষেপে পুনর্নির্দেশ করে ।
এটি আরও বিশদ দেওয়ার জন্য, ধরে নিই যে আপনার কাছে একটি এমভিসি ভি রয়েছে যা একটি ফর্ম একটি মডেল শ্রেণীর সাথে আবদ্ধ, মডেলটিকে কল করতে দিন ReportVM
।
প্রথমত, একটি নিয়ামক পদক্ষেপ পোস্ট মডেল গ্রহণ করা প্রয়োজন, একটি উদাহরণ হবে:
public ActionResult PostReportPartial(ReportVM model){
ExcelPackage workbook = new ExcelPackage();
string handle = Guid.NewGuid().ToString();
using(MemoryStream memoryStream = new MemoryStream()){
workbook.SaveAs(memoryStream);
memoryStream.Position = 0;
TempData[handle] = memoryStream.ToArray();
}
return new JsonResult() {
Data = new { FileGuid = handle, FileName = "TestReportOutput.xlsx" }
};
}
এজেএক্স কল করে যে আমার এমভিসি ফর্মটি উপরের নিয়ামকের কাছে পোস্ট করে এবং প্রতিক্রিয়া গ্রহণ করে এটির মতো দেখাচ্ছে:
$ajax({
cache: false,
url: '/Report/PostReportPartial',
data: _form.serialize(),
success: function (data){
var response = JSON.parse(data);
window.location = '/Report/Download?fileGuid=' + response.FileGuid
+ '&filename=' + response.FileName;
}
})
ফাইলটি ডাউনলোড করার জন্য নিয়ামক পদক্ষেপ:
[HttpGet]
public virtual ActionResult Download(string fileGuid, string fileName)
{
if(TempData[fileGuid] != null){
byte[] data = TempData[fileGuid] as byte[];
return File(data, "application/vnd.ms-excel", fileName);
}
else{
return new EmptyResult();
}
}
অন্য একটি পরিবর্তন যা প্রয়োজনে সহজেই সংযোজন করা যায় তা হ'ল তৃতীয় প্যারামিটার হিসাবে ফাইলের মাইমে টাইপ পাস করা যাতে একটি কন্ট্রোলার ক্রিয়াটি সঠিকভাবে বিভিন্ন আউটপুট ফাইল ফর্ম্যাটগুলি সরবরাহ করতে পারে।
এটি সার্ভারে তৈরি ও সঞ্চয় করার জন্য কোনও শারীরিক ফাইলের প্রয়োজনীয়তা অপসারণ করে, তাই কোনও বাড়ির রক্ষণাবেক্ষণের রুটিন প্রয়োজন হয় না এবং এটি আবার শেষ ব্যবহারকারীটির জন্য নির্বিঘ্ন।
দ্রষ্টব্য, এর TempData
পরিবর্তে ব্যবহারের সুবিধাটি Session
হ'ল একবার TempData
পড়লে ডেটা সাফ হয়ে যায় তাই আপনার যদি ফাইলের অনুরোধের পরিমাণ বেশি থাকে তবে মেমরির ব্যবহারের ক্ষেত্রে এটি আরও কার্যকর হবে। দেখুন TempData শ্রেষ্ঠ অনুশীলন ।
মূল উত্তর
আপনি এজেএক্স কলের মাধ্যমে ডাউনলোডের জন্য সরাসরি কোনও ফাইল ফেরত দিতে পারবেন না, তাই আপনার সার্ভারে সম্পর্কিত ডেটা পোস্ট করার জন্য একটি এজ্যাক্স কল ব্যবহার করার বিকল্প বিকল্প approach এরপরে আপনি এক্সেল ফাইল তৈরি করতে সার্ভার সাইড কোড ব্যবহার করতে পারেন (আমি এর জন্য ইপিপ্লাস বা এনপিওআই ব্যবহার করার পরামর্শ দেব যদিও এটি মনে হচ্ছে আপনার এই অংশটি কাজ করছে)।
একবার সার্ভারে ফাইলটি তৈরি হয়ে গেলে ফাইলটি (বা কেবল ফাইলের নাম) আপনার এজেএক্স কলটির রিটার্ন মান হিসাবে ফেরত দেয় এবং তারপরে window.location
এই ইউআরএলে জাভাস্ক্রিপ্ট সেট করে যা ব্রাউজারটি ফাইলটি ডাউনলোড করার অনুরোধ জানাবে।
শেষ ব্যবহারকারীদের দৃষ্টিকোণ থেকে, ফাইল ডাউনলোড অপারেশন নির্বিঘ্ন কারণ তারা অনুরোধের উত্স যে পৃষ্ঠাটি ছেড়ে যায় তা কখনও ছাড়েন না।
এটি অর্জনের জন্য নীচে একটি অজ্যাক্স কলের একটি সাধারণ স্বীকৃত উদাহরণ রয়েছে:
$.ajax({
type: 'POST',
url: '/Reports/ExportMyData',
data: '{ "dataprop1": "test", "dataprop2" : "test2" }',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: function (returnValue) {
window.location = '/Reports/Download?file=' + returnValue;
}
});
- url পরামিতি হ'ল নিয়ন্ত্রক / অ্যাকশন পদ্ধতি যেখানে আপনার কোডটি এক্সেল ফাইল তৈরি করবে।
- ডেটা প্যারামিটারে জাসন ডেটা রয়েছে যা ফর্মটি থেকে বের করা হবে।
- রিটার্নভ্যালু হ'ল আপনার নতুন নির্মিত এক্সেল ফাইলের ফাইলের নাম।
- দ্বারা window.location কন্ট্রোলার / অ্যাকশন পদ্ধতি যে আসলে ডাউনলোডের জন্য আপনার ফাইল ফেরৎ কমান্ড পুনঃনির্দেশ।
ডাউনলোড ক্রিয়াকলাপের জন্য একটি নমুনা নিয়ন্ত্রক পদ্ধতিটি হ'ল:
[HttpGet]
public virtual ActionResult Download(string file)
{
string fullPath = Path.Combine(Server.MapPath("~/MyFiles"), file);
return File(fullPath, "application/vnd.ms-excel", file);
}