2009-10-21 10 views
16

जब फ़ाइल का नाम "Algunas MARCAS que nos acompañan" है, तो ASP.NET MVC एक फ़ाइल को डाउनलोड करने का प्रयास करते समय System.FormatException उठाएं। लेकिन अगर फ़ाइल का नाम "Asistente de Gerencia Comercial" है, तो यह नहीं है।मैं डाउनलोड के लिए फ़ाइल नाम कैसे एन्कोड कर सकता हूं?

मुझे लगता है कि ऐसा इसलिए है क्योंकि UTF-8 एन्कोडिंग से संबंधित कुछ है, लेकिन मुझे नहीं पता कि उस स्ट्रिंग को एन्कोड कैसे करें।

यदि मैं सही हूं, तो मैं स्ट्रिंग को UTF-8 एन्कोडिंग में कैसे एन्कोड कर सकता हूं? अगर मैं सही नहीं हूं, तो मेरी समस्या क्या है?

+0

अब आप उपयोगकर्ता को फ़ाइल कैसे भेज रहे हैं? 'System.Web.Mvc.FileResult' का उपयोग करना? क्या आप अपना कोड पोस्ट कर सकते हैं? –

+0

हां, मैं FileResult का उपयोग कर रहा हूँ। – eKek0

+0

अजीब बात यह है कि 'System.Web.Mvc.FileResult' आंतरिक रूप से 'System.Net.Mime.ContentDisposition' का उपयोग करता है ताकि वह हेडर उत्पन्न कर सके जो प्रतिक्रिया में जोड़ता है। मैं उम्मीद करता हूं कि कक्षा इस काम को करने के लिए आवश्यक स्ट्रिंग एन्कोडिंग को संभालने में सक्षम हो। –

उत्तर

22

मैं डाउनलोड करने के लिए इस तरह फ़ाइल नाम सांकेतिक शब्दों में बदलना,

HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename= " + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)); 
+3

यह + के साथ रिक्त स्थान को प्रतिस्थापित करता है, जो आप जो चाहते हैं वह नहीं हो सकता है। – Cosmin

+2

** नोट **: आधुनिक समय में सही समाधान के लिए, आरएफसी 6266 देखें: http://tools.ietf.org/html/rfc6266 –

5

जेडजेड सांकेतिक शब्दों में बदलनेवाला जवाब के आधार पर, और क्योंकि मैं FileResult उपयोग कर रहा हूँ, मैं के रूप में फ़ाइल नाम सांकेतिक शब्दों में बदलना करने का फैसला किया:

HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8) 
0

मैंने हाल ही में इस के साथ लड़ा है, फाइल नामों के लिए कई संभावित भाषाओं का उपयोग किया जा रहा है (चीनी परीक्षण के लिए अच्छा है)। यहां जो कुछ मैंने समाप्त किया है उसके करीब कुछ है (अन्य कार्यान्वयन विवरण को छोड़कर):

HttpUtility.UrlEncode("é", System.Text.Encoding.GetEncoding("ISO-8859-1")) 
1

यह समस्या वर्षों से ज्ञात है। जहां तक ​​मैं कह सकता हूं, वर्तमान में ऐसा करने के लिए कोई अंतःक्रियात्मक तरीका नहीं है, इसलिए उत्तर केवल ब्राउज़र के एक सेट का समर्थन करना है, या उपयोगकर्ता एजेंट को स्नीफिंग करना है।

टेस्ट मामलों और पर लिंक: http://greenbytes.de/tech/tc2231/

0

टिप्पणी है कि UTF एन्कोडिंग का उपयोग कर '+' के साथ या तो निम्नलिखित कोड का एक ही परिणाम में फ़ाइल के नाम में रिक्त स्थान की जगह:

HttpUtility.UrlEncode("é", System.Text.Encoding.GetEncoding("ISO-8859-1")) 
HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8) 
0
उपयोग करने के बजाए

httpUtility कि निम्नलिखित कोड संकल्प समस्या का उपयोग कर के साथ "+" फ़ाइल नाम में रिक्त स्थान की जगह:

string attachment = String.Format("attachment; filename={0}",Server.UrlPathEncode(file.Name.TrimEnd())); 
Response.AddHeader("Content-Disposition", attachment); 

कृपया डेटा आप सेट से है कि यदि आप फ़ाइल नाम को पुनः प्राप्त ध्यान दें पहले नाम को ट्रिम करने की आवश्यकता हो सकती है! आपको अग्रिम में कोड की निम्नलिखित पंक्तियां भी जोड़नी होंगी:

Response.Charset = "utf-8"; 
Response.HeaderEncoding = UnicodeEncoding.UTF8; 
Response.ContentEncoding = UnicodeEncoding.UTF8; 
संबंधित मुद्दे