SORU
18 EYLÜL 2008, PERŞEMBE


Nasıl İçerik-Disposition dosya adı parametre kodlama HTTP üstbilgi?

Bir kaynak için güç isteyen Uygulamaları Webindirilenyerine doğrudanişlenmişbir Web tarayıcısında sorun formun HTTP yanıtı Content-Disposition Bir Başlık:

Content-Disposition: attachment; filename=FILENAME

filename parametre içine kaynak tarayıcısı, dosya için bir ad önermek için kullanılabilir. RFC 2183 (İçerik-Disposition), ancak section 2.3 dosya adı, US-ASCII kullanabilen (Filename Parametresi) karakter durumları:

Güncel [RFC 2045] dilbilgisi kısıtlar parametre değerleri (ve dolayısıyla İçerik-Disposition dosya adları) US-ASCII. Büyük farkındayız cazibe keyfi izin verme karakter dosya, ama batar bu belgenin konusu ötesinde gerekli mekanizmaları tanımlamak.

Orada deneysel kanıtlar, yine de, en popüler Web tarayıcıları bugün pek izin US-ASCII olmayan karakterler henüz (eksikliği için bir standart) katılmıyorum kodlama düzeni ve karakter özellikleri olan bir dosya. Soru o zaman, ne kadar çeşitli düzenleri ve kodlamalar istihdam ile bu popüler tarayıcıları dosya adı “naïvefile” (tırnak işaretleri olmadan ve üçüncü harfi U 00EF) gerekli olması halinde kodlanmış İçerik-Disposition üstbilgi?

Bu sorunun amacı içinpopüler tarayıcılarolmak:

  • Firefox
  • Internet Explorer
  • Safari
  • Google Chrome
  • Opera

CEVAP
19 Temmuz 2011, Salı


Bu eski bir yazı olduğunu biliyorum ama yine de çok ilgili. Modern tarayıcılar utf-8 kodlaması, yüzde kodlanmış (url-kodlanmış) sağlayan rfc5987, destek bulduk. O zaman Saf file.txt olur:

Content-Disposition: attachment; filename*=UTF-8''Naïve file.txt

Safari (5) Bu desteği vermez ve yerine doğrudan dosya adı utf-8 kodlanmış senin başlığında yazma Safari standart:

Content-Disposition: attachment; filename=Naïve file.txt

Ben de destek yok IE8 ve daha eski ve utf-8 kodlanmış yüzde kodlama YANİ standart kullanmanız gerekir:

Content-Disposition: attachment; filename=Naïve file.txt

ASP.NET aşağıdaki kodu kullanıyorum:

string contentDisposition;
if (Request.Browser.Browser == "IE" && (Request.Browser.Version == "7.0" || Request.Browser.Version == "8.0"))
    contentDisposition = "attachment; filename="   Uri.EscapeDataString(fileName);
else if (Request.Browser.Browser == "Safari")
    contentDisposition = "attachment; filename="   fileName;
else
    contentDisposition = "attachment; filename*=UTF-8''"   Uri.EscapeDataString(fileName);
Response.AddHeader("Content-Disposition", contentDisposition);

IE 7, IE8, IE9, Chrome, yukarıda 13, Opera 11, FF5, Safari 5 test ettim.

GüncellemeKasım 2013:

İşte ben şu anda kullanılan kod. Ben hala IE8, bunu kurtulmak ilk bölümünün desteği var. Android tarayıcılar standart şekilde Android indirme yöneticisi dahili ve güvenilir bir şekilde ayrıştırılamıyor dosya adları çıkıyor.

string contentDisposition;
if (Request.Browser.Browser == "IE" && (Request.Browser.Version == "7.0" || Request.Browser.Version == "8.0"))
    contentDisposition = "attachment; filename="   Uri.EscapeDataString(fileName);
else if (Request.UserAgent != null && Request.UserAgent.ToLowerInvariant().Contains("android")) // android built-in download manager (all browsers on android)
    contentDisposition = "attachment; filename=\""   MakeAndroidSafeFileName(fileName)   "\"";
else
    contentDisposition = "attachment; filename=\""   fileName   "\"; filename*=UTF-8''"   Uri.EscapeDataString(fileName);
Response.AddHeader("Content-Disposition", contentDisposition);

Yukarıda şimdi 7-11, test Chrome 32, Opera 12, FF25, Safari 6, indirmek için bu dosya adı kullanarak: 你好abcABCæøåÆØÅäöüïëêîâéíáóúýñ½§#¤%!&()=`@£$€{[]} ^~'-_,;.txt

IE 7 üzerinde ama hepsi değil bazı karakterler için çalışır. Ama IE 7 hakkında bugünlerde kimin umurunda?

Bu Android için güvenli dosya adları oluşturmak için kullandığım fonksiyon. Android desteklenen bilmiyorum ama bu emin: çalışan test ettik unutmayın

private static readonly Dictionary<char, char> AndroidAllowedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ._- ,@£$€!½§~'=()[]{}0123456789".ToDictionary(c => c);
private string MakeAndroidSafeFileName(string fileName)
{
    char[] newFileName = fileName.ToCharArray();
    for (int i = 0; i < newFileName.Length; i  )
    {
        if (!AndroidAllowedChars.ContainsKey(newFileName[i]))
            newFileName[i] = '_';
    }
    return new string(newFileName);
}

@TomZ: IE 7 ve IE8 test ettim ve kesme işareti kaçmaya ihtiyacım olmadığı ortaya çıktı ('). Başarısız bir örnek var mı?

@Dave Van den Eynde: Android IE 7 ve 8 hariç RFC6266 çalışmalara göre tek satır olarak iki dosya adları Birleştiren ve kodu bu yansıtacak şekilde güncelledik. Öneri için teşekkür ederim.

@Thilo: GoodReader veya başka herhangi bir konuda Hiçbir fikri olmayan bir tarayıcı. Bazı şanslar Android yaklaşımıyla olabilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Christian Atlas

    Christian At

    26 Mart 2009
  • Neil Cicierega

    Neil Ciciere

    22 Mart 2006
  • Vicious Computers

    Vicious Comp

    14 EKİM 2006