ASP.NET वेब एपीआई में डाउनलोडिंग फ़ाइल नाम कैसे सेट करें


140

मेरे ApiController वर्ग में, मेरे पास सर्वर द्वारा बनाई गई फ़ाइल डाउनलोड करने की विधि है।

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
क्या आप उस कोड को साझा कर सकते हैं जिसका उपयोग आपने इस विधि से किया था?
यासर शेख

@ वायसर - यह एक वेब एपीआई कंट्रोलर विधि है - यह संभवतः आईआईएस में आने वाले HTTP अनुरोधों के माध्यम से कॉल किया जा रहा है और उन्हें पार्स कर रहा है और मार्ग और वेब एपीआई को विधि कह रहा है (और, ज़ाहिर है, इसे परीक्षणों द्वारा भी बुलाया जा रहा है)।
डेव Rael

GetMyForm () के अंदर क्या हो रहा है? फ़ाइलों को बाइट्स की धारा में परिवर्तित करना?
MSIslam

@MSIslam क्रमबद्ध करें। फ़ंक्शन उपयोगकर्ता के फॉर्म से जानकारी प्राप्त करता है और परिणामी स्ट्रीम में कनवर्ट करने से पहले एक फ़ाइल बनाता है।
ताए-सुंग शिन

जवाबों:


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
"अटैचमेंट"
विवाद

1
आपके पास यहां फ़ाइल डाउनलोड करने का एक और उत्तर है। इससे कोई फर्क नहीं पड़ता कि आप उपयोग करते हैं System.Net.Mime.ContentDispositionया नहीं ContentDispositionHeaderValue? क्या एक वर्तमान और दूसरे की तुलना में अधिक पसंदीदा है?
चमकदार

@ चमकदार एक उत्तर के लिए है ActionResult, किसी के लिएHttpResponseMessage
वेस्टन

@ वेस्टन आपकी प्रतिक्रिया मेरे सवाल का जवाब नहीं देता है।
चमकदार

4
@ चमकदार "क्या यह मायने रखता है" और "क्या एक और वर्तमान है और दूसरे की तुलना में अधिक पसंदीदा है?" नहीं, और नहीं। एक MVC ActionResults के लिए है, और एक WebApi HttpResponseMessages के लिए है।
पश्चिम

27

संपादित करें: जैसा कि एक टिप्पणी में उल्लेख किया गया है, मेरा उत्तर उन पात्रों के लिए जिम्मेदार नहीं है, जिन्हें ए की तरह भागने की आवश्यकता है ;। यदि आपके फ़ाइल नाम में अर्ध-कॉलन हो सकता है, तो आपको स्वीकृत उत्तर डारिन का उपयोग करना चाहिए।

फ़ाइल का नाम सेट करने के लिए एक Response.AddHeader जोड़ें

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

फ़ाइल के नाम के लिए बस FILE_NAME बदलें।


2
यह प्रश्न पूछने वाले के लिए एक समान समस्या को हल करने में मेरे लिए मददगार साबित हुआ। मेरे मामले में, मुझे "इनलाइन" के लिए "अटैचमेंट" को बदलना भी उपयोगी लगा, ताकि IE8 मुझे हमेशा फ़ाइल प्रकार को प्रश्न में खोलने का विकल्प दे।
स्कॉट

2
बचने को कवर नहीं करता है। क्या होगा अगर फ़ाइल नाम में ;एक विशेष अर्थ के साथ एक या कुछ और शामिल है?
सैम

सैम, जिस समय मैंने 3 साल पहले यह उत्तर लिखा था, मुझे भागने से निपटने के लिए आवश्यक मेरे उत्तर का एहसास नहीं था। इसके लिए मुझे इंगित करने के लिए धन्यवाद, मैंने अपने उत्तर को स्पष्ट करते हुए अपने उत्तर को संपादित किया, जिससे बचने का कोई हिसाब नहीं है। लेकिन मेरे जवाब को वैसा ही रखते हुए, क्योंकि ऐसा लगता था कि लोगों ने मदद की है।
राजापंचके

8

यदि आप यह सुनिश्चित करना चाहते हैं कि फ़ाइल नाम ठीक से एन्कोडेड है, लेकिन WebApi HttpResponseMessage से बचें, तो आप निम्नलिखित का उपयोग कर सकते हैं:

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

आप या तो ContentDisposition या ContentDispositionHeaderValue का उपयोग कर सकते हैं। या तो एक उदाहरण पर ToString को कॉल करना आपके लिए फ़ाइल नामों की एन्कोडिंग करेगा।


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

यदि आप ASP.NET Core MVC का उपयोग कर रहे हैं, तो ऊपर दिए गए उत्तर कभी थोड़े बदले गए हैं ...

अपने एक्शन मेथड में (जो रिटर्न करता है async Task<JsonResult>) मैं लाइन जोड़ता हूं (रिटर्न स्टेटमेंट से पहले कहीं भी):

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

बचने को कवर नहीं करता है। क्या होगा अगर फ़ाइल नाम में ए; या एक विशेष अर्थ के साथ कुछ और?
कोअलाबर

2

यह करना चाहिए:

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

2
बचने को कवर नहीं करता है। क्या होगा अगर फ़ाइल नाम में ;एक विशेष अर्थ के साथ एक या कुछ और शामिल है?
सैम

0

नोट: अंतिम पंक्ति अनिवार्य है।

यदि हमने Access-Control-Expose-Headers निर्दिष्ट नहीं किया है , तो हमें UI में फ़ाइल नाम नहीं मिलेगा।

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

पिछले उत्तरों को ध्यान में रखते हुए, भूमंडलीकृत पात्रों के साथ सावधान रहना आवश्यक है।

मान लीजिए कि फ़ाइल का नाम है: " एस्डरुजुला प्रिंडे ñame - güena.jpg "

कच्चा परिणाम डाउनलोड करने के लिए: "Esdrújula prenda à e ame - güena.jpg" "बदसूरत]

HtmlEncode परिणाम डाउनलोड करने के लिए: "Esdr & _250; जुला प्रेंडा और _241; ame - g & _252; ena.jpg" [बदसूरत]

UrlEncode परिणाम डाउनलोड करने के लिए: " Esdrújula + prenda + ñ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());

The System.Net.Mime। ContentDisposition वर्ग उद्धरणों का ध्यान रखता है।

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