এএসপি.নেট কোর ওয়েব এপিআইতে ফাইলটি ফিরুন


130

সমস্যা

আমি আমার এএসপি.নেট ওয়েব এপিআই কন্ট্রোলারে একটি ফাইল ফিরতে চাই, তবে আমার সমস্ত পন্থাগুলি জেএসএন HttpResponseMessageহিসাবে ফিরিয়ে দেয় ।

এখন পর্যন্ত কোড

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

আমি যখন আমার ব্রাউজারে এই শেষ পয়েন্টটি কল করি তখন ওয়েব এপিআই HttpResponseMessageএইচটিটিপি বিষয়বস্তু শিরোনাম সেট করে JSON হিসাবে ফেরত দেয় application/json

উত্তর:


226

যদি এটি এএসপিএন-কোর হয় তবে আপনি ওয়েব এপিআই সংস্করণগুলি মিশ্রণ করছেন। 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"); এটি যখন ডাউনলোড হয় তখন ব্যবহারকারী এটি সরাসরি খুলতে পারে।
কেএমজুঙ্গারসেন

আমি NotFound()চূড়ান্তভাবে কী করে তা বুঝতে পারি তবে এটি কী NET কোর এর মধ্যে থাকে বা এটি আপনার প্রকল্পের স্থানীয় কিছু?
মেগান

2
@ Ωমেগা এটি একটি সহায়ক পদ্ধতি ControllerBaseএবং এটি নিজেই কাঠামোর অংশ ডক্স.মাইক্রোসফট
Nkosi

3
ঠিক আছে, আমার সমস্যাটি খুঁজে পেয়েছিল , যদিও আমার নিয়ামক। নেট কোর ২.২ এ কাজ করছিল, এটি বেস ক্লাস থেকে উদ্ভূত Controllerহয়নি এবং ControllerBase.NotFound()পদ্ধতিটিতে অ্যাক্সেস নেই । একবার উত্পন্ন, এটি সব কাজ করে। lol / thx
5megaMan

1
আপনি সার্ভার থেকে বড় ফাইল ডাউনলোড করার ক্ষেত্রে এই পদ্ধতিটি কি সিস্টেমের মেমোরি গ্রহণ করে? আমার প্রথম অনুমানটি এই নয় যে আমরা একটি নতুন মেমরিস্ট্রিম () তৈরি করছি না given আমি একটি উত্তর প্রশংসা করি। thx
এহসান নাজাফি

16

আপনি এই পদ্ধতিগুলির সাহায্যে ফাইলের ফলাফলটি ফিরে আসতে পারেন:

1: ফাইল স্ট্রিম রিসার্ট রিটার্ন করুন

    [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: ফাইলকন্টেন্টের রিসার্ট রিটার্ন করুন

    [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
হ্যা এইটা সত্যি.
হামেদ নাeeমাই

9

এখানে একটি ফাইল স্ট্রিমিংয়ের সরল উদাহরণ রয়েছে:

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

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