मैं एमवीसी नियंत्रक से डाउनलोड के लिए एक फ़ाइल कैसे प्रस्तुत कर सकता हूं?


109

WebForms में, मेरे पास सामान्य रूप से इस तरह का कोड होगा कि ब्राउज़र को एक "डाउनलोड फ़ाइल" पॉपअप को एक मनमाना फ़ाइल प्रकार, एक पीडीएफ और एक फ़ाइल नाम के साथ प्रस्तुत करने के लिए:

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()

मैं ASP.NET MVC में समान कार्य कैसे पूरा कर सकता हूं?

जवाबों:


181

अपने एक्शन से लौटें FileResultया FileStreamResultनहीं, इस पर निर्भर करता है कि फाइल मौजूद है या आप इसे फ्लाई पर बनाते हैं।

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

14
यह एक महान उदाहरण है कि ASP.NET MVC भयानक क्यों है। आपको पहले जो देखना था 9 कन्फ्यूज़िंग लुकिंग कोड एक लाइन में किए जा सकते थे। इतना आसान!
जॉन क्रुगर

धन्यवाद tvanfosson, मैंने ऐसा करने के लिए सबसे अच्छा समाधान खोजा, और यह बहुत अच्छा है।
मार्क काडलेक

1
इसके लिए फ़ाइल नाम पर फ़ाइल एक्सटेंशन की आवश्यकता होती है अन्यथा यह फ़ाइल नाम और सामग्री को पूरी तरह से अनदेखा कर देगा और फ़ाइल को ब्राउज़र में स्ट्रीम करने का प्रयास करेगा। यदि ब्राउज़र डाउनलोड करने के लिए बाध्य करता है तो यह वेबपेज के नाम का उपयोग नहीं करेगा, जब यह डाउनलोड को बाध्य करता है और इसका विस्तार नहीं होगा।
12

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;को पारित करके Http रिस्पांस हेडर में जोड़ा जाता है। मेरा समाधान application\force-downloadमाइम-प्रकार के रूप में भेजने के लिए था , लेकिन यह डाउनलोड के फ़ाइल नाम के साथ एक समस्या उत्पन्न करता है इसलिए एक अच्छा फ़ाइल नाम भेजने के लिए तीसरे पैरामीटर की आवश्यकता होती है, इसलिए एक डाउनलोड को मजबूर करने की आवश्यकता को समाप्त करता है ।


6
तकनीकी रूप से वह नहीं है जो हो रहा है। तकनीकी रूप से जब आप तीसरा पैरामीटर जोड़ते हैं, तो MVC फ्रेमवर्क हेडर जोड़ता है content-disposition: attachment; filename=MyRenamedFile.pdf- यह वही है जो डाउनलोड को मजबूर करता है। मेरा सुझाव है कि आप MIME प्रकार को वापस रखें application/pdf
चार्लिनो

2
चार्लिनो धन्यवाद, मुझे एहसास नहीं था कि तीसरा पैरामीटर ऐसा कर रहा था, मुझे लगा कि यह सिर्फ फ़ाइल नाम बदलना है।
21

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();
}

मैंने क्रोम और IE9 में इसकी कोशिश की, दोनों ही पीडीएफ फाइल डाउनलोड कर रहे हैं।

मुझे संभवतः जोड़ना चाहिए कि मैं अपनी PDF बनाने के लिए RazorPDF का उपयोग कर रहा हूं। यहाँ इसके बारे में एक ब्लॉग है: http://nyveldt.com/blog/post/Introducing-RazorPDF


4

आपको नियंत्रक की फ़ाइल विधि को देखना चाहिए। यह वास्तव में यही है। यह एक ActionPult के बजाय एक FilePathResult देता है।


3

mgnoonan,

FileStream को वापस करने के लिए आप यह कर सकते हैं:

/// <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

हालाँकि मानक क्रिया परिणाम FileContentResult या FileStreamResult का उपयोग फ़ाइलों को डाउनलोड करने, पुन: प्रयोज्य के लिए किया जा सकता है, एक कस्टम क्रिया परिणाम बनाना सबसे अच्छा समाधान हो सकता है।

एक उदाहरण के रूप में आइए डाउनलोड के लिए मक्खी पर एक्सेल फ़ाइलों को डेटा निर्यात करने के लिए एक कस्टम एक्शन परिणाम बनाते हैं।

ExcelResult वर्ग अमूर्त ActionResult वर्ग वारिस करता है और ExecuteResult विधि को ओवरराइड करता है।

हम डेटाटेबल से एक्सेल फाइल बनाने के लिए IEnumerable ऑब्जेक्ट से डेटाटैब बनाने के लिए FastMember पैकेज और ClosedXML पैकेज का उपयोग कर रहे हैं।

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());
                }
            }
        }
    }
}

नियंत्रक में कस्टम ExcelResult कार्रवाई परिणाम निम्नानुसार उपयोग करें

[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);
}

चूंकि हम HttpGet का उपयोग करके फ़ाइल डाउनलोड कर रहे हैं, इसलिए बिना मॉडल और खाली लेआउट के एक खाली दृश्य बनाएं।

मक्खी पर बनाई गई फ़ाइलों को डाउनलोड करने के लिए कस्टम एक्शन परिणाम के बारे में ब्लॉग पोस्ट:

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


-4

.Ashx फ़ाइल प्रकार का उपयोग करें और समान कोड का उपयोग करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.