ASP.Net कोर वेब एपीआई में रिटर्न फाइल


131

संकट

मैं अपने ASP.Net वेब एपीआई नियंत्रक में एक फ़ाइल वापस करना चाहता हूं, लेकिन मेरे सभी दृष्टिकोण HttpResponseMessageJSON के रूप में वापस आते हैं ।

अब तक का कोड

public async Task<HttpResponseMessage> DownloadAsync(string id)
{
    var response = new HttpResponseMessage(HttpStatusCode.OK);
    response.Content = new StreamContent({{__insert_stream_here__}});
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
    return response;
}

जब मैं अपने ब्राउज़र में इस समापन बिंदु को कॉल करता हूं, तो वेब एपीआई HttpResponseMessageHTTP कंटेंट हैडर के साथ JSON के रूप में वापस आ जाता है application/json।

जवाबों:


228

यदि यह ASP.net-Core है तो आप वेब API वर्जन को मिला रहे हैं। कार्रवाई व्युत्पन्न लौटाएं IActionResultक्योंकि आपके वर्तमान कोड में रूपरेखा HttpResponseMessageएक मॉडल के रूप में व्यवहार कर रही है।

[Route("api/[controller]")]
public class DownloadController : Controller {
    //GET api/download/12345abc
    [HttpGet("{id}"]
    public async Task<IActionResult> Download(string id) {
        Stream stream = await {{__get_stream_based_on_id_here__}}

        if(stream == null)
            return NotFound(); // returns a NotFoundResult with Status404NotFound response.

        return File(stream, "application/octet-stream"); // returns a FileStreamResult
    }    
}

12
मेरे मामले में मुझे एक एक्सेल को मेमोरी में रेंडर करने और डाउनलोड के लिए वापस करने की आवश्यकता थी, इसलिए मुझे एक्सटेंशन के साथ एक फ़ाइल नाम को भी परिभाषित करने की आवश्यकता थी: return File(stream, "application/octet-stream", "filename.xlsx"); इस तरह जब वह डाउनलोड करता है तो उपयोगकर्ता इसे सीधे खोल सकता है।
— KMJungersen

मैं समझता हूं कि NotFound()अंततः क्या करता है, लेकिन क्या यह .NET कोर में रहता है या यह आपकी परियोजना के लिए कुछ स्थानीय है?
— 15मेगामैन

2
@ OnmegaMan यह एक सहायक विधि है ControllerBaseऔर इस ढांचे का हिस्सा है docs.microsoft.com/en-us/dotnet/api/…
— Nkosi

3
ठीक है, मेरा मुद्दा मिला , हालांकि मेरा नियंत्रक .NET कोर 2.2 में काम कर रहा था, यह आधार वर्ग से प्राप्त नहीं हुआ Controllerथा इस प्रकार ControllerBase.NotFound()विधि तक पहुंच नहीं थी । एक बार व्युत्पन्न, यह सब काम किया। lol / thx
— gamegaMan

1
यदि आप सर्वर से बड़ी फ़ाइलों को डाउनलोड कर रहे हैं तो क्या यह विधि सिस्टम मेमोरी का उपभोग करती है? मेरा पहला अनुमान नहीं है, इस तथ्य को देखते हुए कि हम एक नया मेमोरीस्ट्रीम () नहीं बना रहे हैं। मैं एक जवाब की सराहना करता हूं। thx
— एहसान नजफी

16

आप इस तरीके से FileResult को वापस कर सकते हैं:

1: रिटर्न FileStreamResult

    [HttpGet("get-file-stream/{id}"]
    public async Task<FileStreamResult> DownloadAsync(string id)
    {
        var fileName="myfileName.txt";
        var mimeType="application/...."; 
        var stream = await GetFileStreamById(id);

        return new FileStreamResult(stream, mimeType)
        {
            FileDownloadName = fileName
        };
    }

2: FileContentResult लौटें

    [HttpGet("get-file-content/{id}"]
    public async Task<FileContentResult> DownloadAsync(string id)
    {
        var fileName="myfileName.txt";
        var mimeType="application/...."; 
        var fileBytes = await GetFileBytesById(id);

        return new FileContentResult(fileBytes, mimeType)
        {
            FileDownloadName = fileName
        };
    }

2
अगर ControllerBaseवहाँ ControllerBase.Fileसहायक के कई अतिभारित संस्करण हैं जो उनमें से किसी एक को वापस करते हैं।
— नाकोसी

2
आपका उत्तर अभी भी मान्य है। इसलिए निराश मत हो। मैं सिर्फ कुछ संसाधनों की ओर इशारा कर रहा था जिनका उपयोग आप अपने उत्तर का समर्थन करने के लिए कर सकते हैं।
— नाकोसी

1
हाँ यह सच है।
— नामीमेई

10

यहाँ एक फ़ाइल स्ट्रीमिंग का एक सरल उदाहरण है:

using System.IO;
using Microsoft.AspNetCore.Mvc;
[HttpGet("{id}")]
public async Task<FileStreamResult> Download(int id)
{
    var path = "<Get the file path using the ID>";
    var stream = File.OpenRead(path);
    return new FileStreamResult(stream, "application/octet-stream");
}

ध्यान दें:

का उपयोग सुनिश्चित करें FileStreamResultसे Microsoft.AspNetCore.Mvcऔर नहीं से System.Web.Mvc।

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