এএসপি.নেট ওয়েব এপিআইতে ফাইলের নাম ডাউনলোড করার পদ্ধতি কীভাবে সেট করা যায়


140

আমার এপিআইকন্ট্রোলার ক্লাসে, সার্ভার দ্বারা নির্মিত একটি ফাইল ডাউনলোড করার জন্য আমার নীচের পদ্ধতি রয়েছে।

public HttpResponseMessage Get(int id)
{
    try
    {
        string dir = HttpContext.Current.Server.MapPath("~"); //location of the template file
        Stream file = new MemoryStream();
        Stream result = _service.GetMyForm(id, dir, file);
        if (result == null)
        {
            return Request.CreateResponse(HttpStatusCode.NotFound);
        }
        result.Position = 0;
        HttpResponseMessage response = new HttpResponseMessage();
        response.StatusCode = HttpStatusCode.OK;
        response.Content = new StreamContent(result);
        return response;
    }
    catch (IOException)
    {
        return Request.CreateResponse(HttpStatusCode.InternalServerError);
    }
}

ডিফল্ট ডাউনলোড করা ফাইলের নামটি বাদে সবকিছুই নিখুঁতভাবে কাজ করছে যাতে ব্যবহারকারী প্রতিটি সময় ডায়ালগ হিসাবে তার নিজের ফাইলের নাম সংরক্ষণ করতে পারেন। উপরের কোডটিতে কোনও ডিফল্ট ফাইল নাম সেট করার কোনও উপায় আছে কি?


1
আপনি এই পদ্ধতিটি কল করার জন্য যে কোডটি ব্যবহার করেছেন তা কি ভাগ করে নিতে পারেন?
ইয়াসের শায়খ

@ ইয়াসার - এটি একটি ওয়েব এপিআই কন্ট্রোলার পদ্ধতি - এটি সম্ভবত এইচটিটিপি অনুরোধের মাধ্যমে আইআইএস-এ আসে এবং তাদের বিশ্লেষণ করে এবং পদ্ধতিটি কল করার জন্য রুটগুলি এবং ওয়েব এপিআই আবিষ্কার করে (এবং অবশ্যই এটি পরীক্ষার মাধ্যমেও ডাকা হচ্ছে)।
ডেভ রায়েল

গেটমাইফর্ম () এর ভিতরে কী ঘটছে? ফাইলগুলি বাইটের প্রবাহে রূপান্তর করা হচ্ছে?
এমএসআইস্লাম

@ এমএসআইস্লাম বাছাই করুন। ফাংশনটি ব্যবহারকারীর ফর্ম থেকে তথ্য পায় এবং ফলাফল প্রবাহে রূপান্তরিত করার আগে একটি ফাইল তৈরি করে।
তায়ে-সং শিন

উত্তর:


289

আপনাকে এখানে Content-Dispositionশিরোনামটি সেট করতে হবে HttpResponseMessage:

HttpResponseMessage response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(result);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
    FileName = "foo.txt"
};

21
"সংযুক্তি" স্বভাবের ধরন সম্পর্কে কৌতূহলযুক্ত কারও
sfuqua

1
এখানে একটি ফাইল ডাউনলোড করার জন্য আপনার আরও একটি উত্তর রয়েছে আপনি ব্যবহার System.Net.Mime.ContentDispositionবা না তা বিবেচনা করে না ContentDispositionHeaderValue? একজনের কি বর্তমানের চেয়ে বেশি এবং অন্যের চেয়ে বেশি পছন্দ?
আলোকিত

@Luminous একটি উত্তর হয় ActionResult, এক জন্যHttpResponseMessage
Weston

@ ওয়েস্টন আপনার প্রতিক্রিয়া আমার প্রশ্নের উত্তর দেয় না।
আলোকিত

4
@ আলোকিত "এটি কী গুরুত্বপূর্ণ?" এবং "একজনের চেয়ে অন্য কি বর্তমান এবং আরও পছন্দসই?" না, এবং না। একটি এমভিসি ActionResultগুলি এর জন্য এবং অন্যটি ওয়েবএপিআই HttpResponseMessageএর জন্য।
ওয়েস্টন

27

সম্পাদনা: একটি মন্তব্যে উল্লিখিত হিসাবে, আমার উত্তরটি এমন চরিত্রগুলির জন্য অ্যাকাউন্ট করে না যেগুলি এগুলির মতো পালাতে হবে ;। আপনার ফাইলের নামটিতে একটি আধা-কোলন থাকতে পারে যদি আপনার ডারিনের গৃহীত উত্তরটি ব্যবহার করা উচিত।

একটি প্রতিক্রিয়া যুক্ত করুন file ফাইলের নাম সেট করতে অ্যাডহিডার যুক্ত করুন

Response.AddHeader("Content-Disposition", "attachment; filename=*FILE_NAME*");

কেবল ফাইলের নামে FILE_NAME পরিবর্তন করুন।


2
এটি প্রশ্নকারীদের অনুরূপ সমস্যা সমাধানে আমার পক্ষে সহায়ক প্রমাণিত। আমার ক্ষেত্রে, আমি "সংযুক্তি "টিকে" ইনলাইন "এ পরিবর্তন করাও দরকারী বলে মনে করি যাতে IE8 আমাকে সর্বদা প্রশ্নযুক্ত ফাইলের প্রকারটি খোলার বিকল্প দেয়।
স্কট

2
পালানোর আড়াল করে না। যদি ফাইলের নামটিতে ;একটি বিশেষ অর্থ সহ কোনও বা অন্য কিছু অন্তর্ভুক্ত থাকে ?
স্যাম

স্যাম, 3 বছর আগে আমি যখন এই উত্তরটি লিখেছিলাম তখন আমি পালাতে সক্ষম হবার জন্য আমার উত্তরটি বুঝতে পারি নি। আমার কাছে এটি উল্লেখ করার জন্য আপনাকে ধন্যবাদ, আমি আমার উত্তরে একটি সম্পাদনা করেছি যাতে আমার উত্তরটি পালানোর পক্ষে আসে না expla তবে আমার উত্তরটি একইভাবে রাখছি যেহেতু মনে হয় এটি লোকদের সহায়তা করেছে।
কিংপ্যাঙ্ককে

8

আপনি যদি ফাইলের নামটি যথাযথভাবে এনকোড করা হয়েছে তা নিশ্চিত করতে চান তবে ওয়েবএপি এইচটিপিআরএসপোনসম্যাসেজ এড়াতে পারেন তবে আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

Response.AddHeader("Content-Disposition", new System.Net.Mime.ContentDisposition("attachment") { FileName = "foo.txt" }.ToString());

আপনি ContentDisposition বা ContentDispositionHeaderValue হয় ব্যবহার করতে পারেন। উভয়ের উদাহরণে টসস্ট্রিংকে কল করা আপনার পক্ষে ফাইলের নামগুলির এনকোডিং করবে।


6

আমি মনে করি এটি আপনার পক্ষে সহায়ক হতে পারে।

Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName)

4
পালানোর আড়াল করে না। যদি ফাইলের নামটিতে ;একটি বিশেষ অর্থ সহ কোনও বা অন্য কিছু অন্তর্ভুক্ত থাকে ?
স্যাম

3

প্রতিক্রিয়াতে আপনাকে বিষয়বস্তু-স্বভাবের শিরোনাম যুক্ত করতে হবে:

 response.StatusCode = HttpStatusCode.OK;
 response.Content = new StreamContent(result);
 response.AppendHeader("content-disposition", "attachment; filename=" + fileName);
 return response;

3
পালানোর আড়াল করে না। যদি ফাইলের নামটিতে ;একটি বিশেষ অর্থ সহ কোনও বা অন্য কিছু অন্তর্ভুক্ত থাকে ?
স্যাম

3

আপনি যদি এএসপি.নেট কোর এমভিসি ব্যবহার করেন তবে উপরের উত্তরগুলি এত সামান্য পরিবর্তিত হয় ...

আমার ক্রিয়া পদ্ধতিতে (যা প্রত্যাবর্তন করে async Task<JsonResult>) আমি লাইনটি যোগ করি (প্রত্যাবর্তনের বিবৃতি দেওয়ার আগে যে কোনও জায়গায়):

Response.Headers.Add("Content-Disposition", $"attachment; filename={myFileName}");

পালানোর আড়াল করে না। যদি ফাইলের নামটিতে একটি অন্তর্ভুক্ত থাকে; বা একটি বিশেষ অর্থ সঙ্গে অন্য কিছু?
কোয়ালা বিয়ার

2

এটি করা উচিত:

Response.AddHeader("Content-Disposition", "attachment;filename="+ YourFilename)

2
পালানোর আড়াল করে না। যদি ফাইলের নামটিতে ;একটি বিশেষ অর্থ সহ কোনও বা অন্য কিছু অন্তর্ভুক্ত থাকে ?
স্যাম

0

দ্রষ্টব্য: শেষ লাইনটি বাধ্যতামূলক।

আমরা যদি অ্যাক্সেস-কন্ট্রোল-এক্সপোজ-শিরোনামগুলি নির্দিষ্ট না করে থাকি তবে আমরা ইউআই তে ফাইলের নাম পাব না।

FileInfo file = new FileInfo(FILEPATH);

HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
    FileName = file.Name
};
response.Content.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition");

0

পূর্ববর্তী উত্তরগুলি বিবেচনা করে, বিশ্বায়িত চরিত্রগুলির সাথে সতর্ক হওয়া প্রয়োজন।

ধরা যাক ফাইলটির নাম: " এসড্রজুলা প্রেন্ডা ইমেজ - güena.jpg "

ডাউনলোডের জন্য কাঁচা ফলাফল: "এসিড্রজুলা প্রেণ্ডা ü ± এমমে - güena.jpg" [কুরুচিপূর্ণ]

এইচটিএমএল কোডের ডাউনলোডের ফলাফল : "এসডিআর & _250; জুলা প্রেন্ডা & _241; অ্যামে - জি & 52; ena.jpg" [কুশলী]

ডাউনলোড করতে ইউরালকোড ফলাফল : " এসড্রেজুলা + প্রেন্ডা + +ame + - + güena.jpg " [ঠিক আছে]

তারপরে, আপনার প্রায় সবসময় ফাইলের নামের মাধ্যমে urlEncode ব্যবহার করা দরকার । তদুপরি, আপনি যদি কন্টেন্ট-ডিসপোশন শিরোনামকে সরাসরি স্ট্রিং হিসাবে সেট করেন তবে ব্রাউজারের সামঞ্জস্যতার সমস্যাগুলি এড়াতে আপনার উদ্ধৃতি সহ আশেপাশের বিষয়টি নিশ্চিত করতে হবে

Response.AddHeader("Content-Disposition", $"attachment; filename=\"{HttpUtility.UrlEncode(YourFilename)}\"");

বা ক্লাস এইড সহ:

var cd = new ContentDisposition("attachment") { FileName = HttpUtility.UrlEncode(resultFileName) };
Response.AddHeader("Content-Disposition", cd.ToString());

System.Net.Mime। কন্টেন্টডিসপজিশন ক্লাস উদ্ধৃতিগুলির যত্ন নেয়।

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