2009-09-01 10 views
42

मुझे HTTP शीर्षलेखों में समस्या है, वे एएससीआईआईआई में एन्कोड किए गए हैं और मैं फ़ाइलों को डाउनलोड करने के लिए एक दृश्य प्रदान करना चाहता हूं जो नाम AS ASII हो सकते हैं।HTTP हेडर के लिए यूटीएफ 8 फ़ाइल नाम को एन्कोड कैसे करें? (पायथन, डीजेगो)

response['Content-Disposition'] = 'attachment; filename="%s"' % (vo.filename.encode("ASCII","replace"),) 

मैं स्थिर गैर ASCII फ़ाइल नाम के साथ लेकिन इस मामले में एक ही मुद्दे के लिए की सेवा फ़ाइलों का उपयोग करने के लिए फाइल सिस्टम के साथ एक समस्या होगी नहीं करना चाहते हैं और यह फ़ाइल नाम एन्कोडिंग है। (मुझे लक्ष्य ओएस पता नहीं है।)

मैंने पहले से ही urllib.quote() की कोशिश की है, लेकिन यह KeyError अपवाद उठाता है।

संभवतः मैं कुछ गलत कर रहा हूं लेकिन शायद यह असंभव है।

+1

मुझे एहसास है कि मुझे देर हो चुकी है, लेकिन ... KeyError अपवाद वास्तव में मुझे खराब करता है। मेरा मतलब यह नहीं है कि "हर बार थोड़ी देर में मैं इस समस्या में भाग लेता हूं," मेरा मतलब है, मैंने इस साल पहले ठीक करने के लिए पायथन को एक पैच जमा किया था, थोड़ी देर के लिए तर्क दिया, फिर फैसला किया कि वे पाइथन 2 को बदलना नहीं चाहते थे। पाइथन 3 में इस समस्या को ठीक किया, लेकिन उन्होंने कभी भी पायथन 2 में अपना पैच स्वीकार नहीं किया। कार्य-आसपास पहले .encode ('utf-8') है, और फिर urllib.quote का उपयोग करें। लेकिन यह यूआरएल-एन्कोडिंग के लिए है जो इन्हें हेडर में रखने का मानक तरीका नहीं है। – mgiuca

उत्तर

34

यह एक सामान्य प्रश्न है।

ऐसा करने के लिए कोई इंटरऑपरेबल तरीका नहीं है। कुछ ब्राउज़र मालिकाना एक्सटेंशन (आईई, क्रोम), अन्य कार्यान्वयन आरएफसी 2231 (फ़ायरफ़ॉक्स, ओपेरा) लागू करते हैं।

http://greenbytes.de/tech/tc2231/ पर परीक्षण के मामले देखें।

अपडेट: नवंबर 2012 तक, सभी मौजूदा डेस्कटॉप ब्राउज़र आरएफसी 6266 और आरएफसी 5987 (सफारी> = 6, आईई> = 9, क्रोम, फ़ायरफ़ॉक्स, ओपेरा, कॉन्करर) में परिभाषित एन्कोडिंग का समर्थन करते हैं।

+0

धन्यवाद! सबसे आसान चीजें खोजने के लिए सबसे कठिन हैं;) –

+0

हाल ही में, जूलियन ने इस उद्देश्य के लिए आरएफसी 2231 का एक प्रोफ़ाइल रखा है: http://datatracker.ietf.org/doc/draft-reschke-rfc2231-in-http/ –

+4

अब प्रकाशित http://greenbytes.de/tech/webdav/rfc5987.html –

30

सामग्री-विस्थापन में फ़ाइल नाम न भेजें। गैर-ASCII शीर्षलेख पैरामीटर क्रॉस-ब्राउज़र (*) बनाने का कोई तरीका नहीं है।

इसके बजाय, बस "सामग्री-विस्थापन: अनुलग्नक" भेजें, और फ़ाइल को अपने यूआरएल के पीछे (PATH_INFO) भाग में यूआरएल-एन्कोडेड यूटीएफ -8 स्ट्रिंग के रूप में छोड़ दें, ब्राउज़र को लेने और डिफ़ॉल्ट रूप से उपयोग करने के लिए । यूटीएफ -8 यूआरएल को सामग्री-विस्थापन के साथ कुछ भी करने के बजाय ब्राउज़रों द्वारा अधिक विश्वसनीय रूप से संभाला जाता है।

(*: वास्तव में, वहाँ नहीं यहाँ तक कि एक मौजूदा मानक है कि यह कैसे RFC, 2616, 2231 और 2047 में बहुत बेकार हैं के बीच संबंधों के रूप में किया जाना चाहिए कहते हैं, कुछ है कि जूलियन एक कल्पना पर मंजूरी दे दी पाने के लिए प्रयास कर रहा है । स्तर लगातार ब्राउज़र समर्थन दूर भविष्य में है)

+3

शीर्ष उत्तर में कुछ अच्छी जानकारी है, लेकिन आपने वास्तव में समस्या हल की है। धन्यवाद! –

+0

ग्रेट उत्तर ... – cherouvim

+7

चूंकि यह उत्तर निकला है, इस विषय पर एक आरएफसी जारी किया गया है। नोट का नाम 'फ़ाइल नाम * =' निर्माण है जो केवल नए ब्राउज़र का समर्थन करता है और आपको यूएफएफ -8 का उपयोग करने की गारंटी देता है, जो आरएफसी 5 9 87 में एन्कोड किया गया है। Http://tools.ietf.org/html/rfc6266#appendix-D –

0

एक हैक:।

if (Request.UserAgent.Contains("IE")) 
{ 
    // IE will accept URL encoding, but spaces don't need to be, and since they're so common.. 
    filename = filename.Replace("%", "%25").Replace(";", "%3B").Replace("#", "%23").Replace("&", "%26"); 
} 
+2

उपयोगकर्ता-एजेंट सामान्य रूप से बदबू आ रही है, [इन बग्गी सर्वर इसका उपयोग करते हैं] (http://greenbytes.de/tech/tc2231/#buggy-senders) और टीसी 2231/आरएफसी 6266 परीक्षण मामलों के लिए ज़िम्मेदार हैं। – Tobu

26

ध्यान दें कि 2011 में, RFC 6266 (विशेष रूप से परिशिष्ट डी) इस मुद्दे पर इस प्रकार से तोला और विशिष्ट सिफारिशों का पालन करना पड़ता है।

अर्थात्, आप filename केवल ASCII वर्णों के साथ जारी कर सकते हैं, इसके बाद filename* के साथ उन एजेंटों के लिए आरएफसी 5987-स्वरूपित फ़ाइल नाम के साथ इसे समझ सकते हैं।

आमतौर पर यह filename="my-resume.pdf"; filename*=UTF-8''My%20R%C3%A9sum%C3%A9.pdf, जहां यूनिकोड फ़ाइल नाम ("मेरा Résumé.pdf") UTF-8 और फिर प्रतिशत-एन्कोड में एन्कोड किया गया है की तरह दिखाई देगा (ध्यान दें, रिक्त स्थान के लिए + उपयोग न करें)।

कृपया वास्तव में आरएफसी 6266 और आरएफसी 5 9 87 (या एक मजबूत और परीक्षण लाइब्रेरी का उपयोग करें जो आपके लिए इसे सारणीबद्ध करता है), क्योंकि मेरे सारांश में महत्वपूर्ण जानकारी में कमी है।

+0

यह मेरी Django परियोजना में फ़ाइल डाउनलोड एंडपॉइंट के लिए आवश्यक है। धन्यवाद! – macguru2000

2

मैं कह सकता हूं कि मुझे ई-मेल फॉर्म (RFC 2231) के साथ एन्कोड किए गए शीर्षलेख को निर्दिष्ट करने के नए (RFC 5987) प्रारूप का उपयोग करके सफलता मिली है। मैं निम्नलिखित समाधान के साथ आया जो django-sendfile प्रोजेक्ट से कोड पर आधारित है।

import unicodedata 
from django.utils.http import urlquote 

def rfc5987_content_disposition(file_name): 
    ascii_name = unicodedata.normalize('NFKD', file_name).encode('ascii','ignore').decode() 
    header = 'attachment; filename="{}"'.format(ascii_name) 
    if ascii_name != file_name: 
     quoted_name = urlquote(file_name) 
     header += '; filename*=UTF-8\'\'{}'.format(quoted_name) 

    return header 

# e.g. 
    # request['Content-Disposition'] = rfc5987_content_disposition(file_name) 

मैं सिर्फ अपने कोड अजगर 3.4 पर साथ Django 1.8 का परीक्षण किया है। तो इसी तरह के solution in django-sendfile आपको बेहतर सूट कर सकते हैं।

Django के ट्रैकर में long standing ticket है जो इसे स्वीकार करता है लेकिन अभी तक कोई पैच प्रस्तावित नहीं किया गया है। तो दुर्भाग्य से यह एक मजबूत परीक्षण लाइब्रेरी का उपयोग करने के करीब है जैसा कि मुझे मिल सकता है, अगर कोई बेहतर समाधान है तो कृपया मुझे बताएं।

संबंधित मुद्दे