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


109

ওয়েবফোর্মে, আমি সাধারণত ব্রাউজারটিকে পিডিএফ এবং ফাইলের মতো একটি স্বেচ্ছাসেবী ফাইল টাইপ সহ একটি "ডাউনলোড ফাইল" পপআপ উপস্থাপন করতে এই জাতীয় কোড রাখতে পারি:

Response.Clear()
Response.ClearHeaders()
''# Send the file to the output stream
Response.Buffer = True

Response.AddHeader("Content-Length", pdfData.Length.ToString())
Response.AddHeader("Content-Disposition", "attachment; filename= " & Server.HtmlEncode(filename))

''# Set the output stream to the correct content type (PDF).
Response.ContentType = "application/pdf"

''# Output the file
Response.BinaryWrite(pdfData)

''# Flushing the Response to display the serialized data
''# to the client browser.
Response.Flush()
Response.End()

আমি কীভাবে এএসপি.নেট এমভিসিতে একই কাজটি সম্পাদন করব?

উত্তর:


181

একটি ফিরতি FileResultবা FileStreamResultআপনার কর্ম থেকে ফাইল বিদ্যমান নয় অথবা আপনার মাছি তে এটি তৈরি কিনা নির্ভর করে।

public ActionResult GetPdf(string filename)
{
    return File(filename, "application/pdf", Server.UrlEncode(filename));
}

14
এটি এএসপি.নেট এমভিসি কেন দুর্দান্ত। বিভ্রান্তিকর বর্ণন কোডের 9 টি লাইনে আপনাকে যা করতে হয়েছিল তা এক লাইনেই করা যেতে পারে। এত সহজ!
জন ক্রুগার

ধন্যবাদ টভানফসন, আমি এটি করার সর্বোত্তম সমাধানটি অনুসন্ধান করেছি এবং এটি দুর্দান্ত।
মার্ক কাদলেক

1
এটির জন্য ফাইলনামে একটি ফাইল এক্সটেনশন প্রয়োজন বা অন্যথায় এটি ফাইলের নাম এবং বিষয়বস্তুটিকে পুরোপুরি উপেক্ষা করবে এবং কেবল ফাইলটি ব্রাউজারে প্রবাহিত করার চেষ্টা করবে। এটি ডাউনলোড করার জন্য ব্রাউজার যখন কন্টেন্ট টাইপ (অর্থাত্ অক্টেট-স্ট্রিম) স্বীকৃতি না দেয় তবে এটি কেবল ওয়েবপৃষ্ঠার নামটি ব্যবহার করবে এবং এটির কোনও এক্সটেনশন হবে না।
রিচসি

62

ব্রাউজারের পিডিএফ প্লাগইন দ্বারা পরিচালনা করার পরিবর্তে একটি পিডিএফ ফাইল ডাউনলোড করতে বাধ্য করতে:

public ActionResult DownloadPDF()
{
    return File("~/Content/MyFile.pdf", "application/pdf", "MyRenamedFile.pdf");
}

আপনি যদি ব্রাউজারটিকে তার ডিফল্ট আচরণ (প্লাগইন বা ডাউনলোড) দ্বারা পরিচালনা করতে চান তবে কেবল দুটি পরামিতি প্রেরণ করুন।

public ActionResult DownloadPDF()
{
    return File("~/Content/MyFile.pdf", "application/pdf");
}

ব্রাউজার সংলাপে ফাইলটির নাম নির্দিষ্ট করতে আপনাকে তৃতীয় প্যারামিটার ব্যবহার করতে হবে।

আপডেট: চার্লিনো ঠিক আছে, তৃতীয় প্যারামিটারটি পাস করার সময় (ফাইলের নাম ডাউনলোড করুন) এইচটিপি রেসপন্স শিরোনামে Content-Disposition: attachment;যুক্ত হয়। আমার সমাধানটি application\force-downloadমাইম-টাইপ হিসাবে প্রেরণ করা হয়েছিল , তবে এটি ডাউনলোডের ফাইলনামের সাথে একটি সমস্যা তৈরি করে তাই তৃতীয় প্যারামিটারকে একটি ভাল ফাইল নাম পাঠাতে হবে, সুতরাং ডাউনলোডের জন্য বাধ্যতামূলককরণের প্রয়োজনীয়তা অপসারণ করা উচিত ।


6
প্রযুক্তিগতভাবে যা ঘটছে তা নয়। প্রযুক্তিগতভাবে আপনি যখন তৃতীয় প্যারামিটার যুক্ত করেন, এমভিসি ফ্রেমওয়ার্কটি শিরোনাম যুক্ত করে content-disposition: attachment; filename=MyRenamedFile.pdf- এটি ডাউনলোডকে বাধ্য করে। আমি আপনাকে মাইম টাইপটি আবার ফিরিয়ে দেওয়ার পরামর্শ দিচ্ছি application/pdf
চার্লিনো

2
আপনাকে ধন্যবাদ চার্লিনো, আমি বুঝতে পারি নি তৃতীয় প্যারামিটারটি এটি করছে, আমি ভেবেছিলাম এটি কেবল ফাইলের নাম পরিবর্তন করা to
গুজার্ট

2
আপনার উত্তর আপডেট করার জন্য এবং তৃতীয় প্যারামিটার + Content-Disposition: attachment;সম্পর্কের ব্যাখ্যা দেওয়ার জন্য +1 ।
চার্লিনো

7

আপনি একইভাবে রেজারে বা নিয়ন্ত্রণকারীতেও করতে পারেন ..

@{
    //do this on the top most of your View, immediately after `using` statement
    Response.ContentType = "application/pdf";
    Response.AddHeader("Content-Disposition", "attachment; filename=receipt.pdf");
}

বা নিয়ামক ..

public ActionResult Receipt() {
    Response.ContentType = "application/pdf";
    Response.AddHeader("Content-Disposition", "attachment; filename=receipt.pdf");

    return View();
}

আমি এটি Chrome এবং IE9 এ চেষ্টা করেছি, দুজনেই পিডিএফ ফাইল ডাউনলোড করছে।

আমার সম্ভবত যুক্ত করা উচিত আমি আমার পিডিএফগুলি তৈরি করতে রেজারপিডিএফ ব্যবহার করছি । এটি সম্পর্কে একটি ব্লগ এখানে: http://nyveldt.com/blog/post/Introducing-RazorPDF


4

আপনার নিয়ন্ত্রকের ফাইল পদ্ধতিটি দেখতে হবে। এটি ঠিক এটির জন্য। এটি একটি অ্যাকশন রেজাল্টের পরিবর্তে ফাইলপ্যাথরেসল্ট দেয় returns


3

mgnoonan,

কোনও ফাইল স্ট্রিম ফিরিয়ে দিতে আপনি এটি করতে পারেন:

/// <summary>
/// Creates a new Excel spreadsheet based on a template using the NPOI library.
/// The template is changed in memory and a copy of it is sent to
/// the user computer through a file stream.
/// </summary>
/// <returns>Excel report</returns>
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult NPOICreate()
{
    try
    {
        // Opening the Excel template...
        FileStream fs =
            new FileStream(Server.MapPath(@"\Content\NPOITemplate.xls"), FileMode.Open, FileAccess.Read);

        // Getting the complete workbook...
        HSSFWorkbook templateWorkbook = new HSSFWorkbook(fs, true);

        // Getting the worksheet by its name...
        HSSFSheet sheet = templateWorkbook.GetSheet("Sheet1");

        // Getting the row... 0 is the first row.
        HSSFRow dataRow = sheet.GetRow(4);

        // Setting the value 77 at row 5 column 1
        dataRow.GetCell(0).SetCellValue(77);

        // Forcing formula recalculation...
        sheet.ForceFormulaRecalculation = true;

        MemoryStream ms = new MemoryStream();

        // Writing the workbook content to the FileStream...
        templateWorkbook.Write(ms);

        TempData["Message"] = "Excel report created successfully!";

        // Sending the server processed data back to the user computer...
        return File(ms.ToArray(), "application/vnd.ms-excel", "NPOINewFile.xls");
    }
    catch(Exception ex)
    {
        TempData["Message"] = "Oops! Something went wrong.";

        return RedirectToAction("NPOI");
    }
}

1

যদিও স্ট্যান্ডার্ড অ্যাকশন ফলাফল ফাইলকন্টেন্টআরসাল্ট বা ফাইলস্ট্রিম রেজাল্ট ফাইলগুলি ডাউনলোড করার জন্য, পুনরায় ব্যবহারযোগ্যতার জন্য ব্যবহার করা যেতে পারে, একটি কাস্টম অ্যাকশন ফলাফল তৈরি করা সেরা সমাধান হতে পারে।

উদাহরণ হিসাবে ডাউনলোডের জন্য ফ্লাইতে এক্সেল ফাইলগুলিতে ডেটা রফতানির জন্য একটি কাস্টম অ্যাকশনের ফলাফল তৈরি করি।

এক্সেলসেলস্ট শ্রেণি বিমূর্ত অ্যাকশনারসাল্ট বর্গ উত্তরাধিকার সূত্রে প্রাপ্ত এবং এক্সিকিউটর রেজাল্ট পদ্ধতিটিকে ওভাররাইড করে।

আমরা ডাটাবেল থেকে এক্সেল ফাইল তৈরির জন্য আইইনুমেবল অবজেক্ট থেকে ডেটা টেবিল এবং ক্লোজডএক্সএমএল প্যাকেজ তৈরির জন্য ফাস্টমেমার প্যাকেজটি ব্যবহার করছি।

public class ExcelResult<T> : ActionResult
{
    private DataTable dataTable;
    private string fileName;

    public ExcelResult(IEnumerable<T> data, string filename, string[] columns)
    {
        this.dataTable = new DataTable();
        using (var reader = ObjectReader.Create(data, columns))
        {
            dataTable.Load(reader);
        }
        this.fileName = filename;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        if (context != null)
        {
            var response = context.HttpContext.Response;
            response.Clear();
            response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            response.AddHeader("content-disposition", string.Format(@"attachment;filename=""{0}""", fileName));
            using (XLWorkbook wb = new XLWorkbook())
            {
                wb.Worksheets.Add(dataTable, "Sheet1");
                using (MemoryStream stream = new MemoryStream())
                {
                    wb.SaveAs(stream);
                    response.BinaryWrite(stream.ToArray());
                }
            }
        }
    }
}

নিয়ামকটিতে কাস্টম এক্সারসেলস্ট ক্রিয়া ফলাফলটি নিম্নরূপ ব্যবহার করুন

[HttpGet]
public async Task<ExcelResult<MyViewModel>> ExportToExcel()
{
    var model = new Models.MyDataModel();
    var items = await model.GetItems();
    string[] columns = new string[] { "Column1", "Column2", "Column3" };
    string filename = "mydata.xlsx";
    return new ExcelResult<MyViewModel>(items, filename, columns);
}

যেহেতু আমরা এইচটিটিপিগেট ব্যবহার করে ফাইলটি ডাউনলোড করছি, তাই মডেল এবং খালি বিন্যাস ছাড়াই একটি খালি ভিউ তৈরি করুন।

ফ্লাইতে তৈরি হওয়া ফাইলগুলি ডাউনলোড করার জন্য কাস্টম অ্যাকশনের ফলাফল সম্পর্কে ব্লগ পোস্ট:

https://acanozturk.blogspot.com/2019/03/custom-actionresult-for-files-in-aspnet.html


-4

.Ashx ফাইল টাইপ ব্যবহার করুন এবং একই কোড ব্যবহার করুন

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