IE6 dosya indirme

12 Cevap php

Ben IE6 ile oldukça interesing (ve sinir bozucu) sorunu geldim. Biz bazı sunucu oluşturulan PDF'leri kadar hizmet veren ve daha sonra sadece dosyanın bir tarayıcı indir zorlamak için PHP başlıklarını belirliyor. Windows kullanıcı hesabı standart kullanıcı (yani değil yönetici) olarak ayarlanırsa, IE6 hariç fakat only, ince ve tüm çalışır.

Bu kurumsal bir ortam için olduğundan, elbette tüm hesapları bu şekilde kurulum vardır. Garip bir şey yükleme iletişim, Content-Type tanınmıyor olmasıdır:

header( 'Pragma: public' );
header( 'Expires: 0' );
header( 'Cache-Control: must-revalidate, pre-check=0, post-check=0' );
header( 'Cache-Control: public' );
header( 'Content-Description: File Transfer' );
header( 'Content-Type: application/pdf' );
header( 'Content-Disposition: attachment; filename="xxx.pdf"' );
header( 'Content-Transfer-Encoding: binary' );
echo $content;
exit;

Ben de bu yüzden ben de başlığındaki Content-Length ayarlanmış olabilir ama yardımcı olmadı ilk geçici bir dosyaya dosya içeriğini yazmaya çalıştım.

12 Cevap

These headers are bogus!

Content-Transfer-Encoding: binary

Bu başlığı e-posta başlığı kopyalanır. HTTP ikili daha transfer başka bir mod yok çünkü sadece HTTP için geçerli değildir. Ayarlayarak X-Bits-Per-Byte: 8 ayar kadar mantıklı.

Cache-control: pre-check=0, post-check=0

IE önbelleğe alınmış içeriği hala taze olup olmadığını kontrol etmelisiniz zaman bu standart dışı değerler tanımlar. 0 böylece 0 zaman kaybıdır olarak ayarlayarak, varsayılan. Bu direktifler önbelleklenebilecek içeriği için geçerlidir, ve Expires:0 ve must-revalidate bunu non-önbelleklenebilecek yapmak istedim ipucu.

Content-Description: File Transfer

Bu başka bir e-posta taklitçi olduğunu. By design bu başlık doesn't affect download in any way. Bu sadece bilgilendirici serbest biçimli metin bulunuyor. Bu X-Hi-Mom: I'm sending you a file! başlığı gibi teknik olarak çok yararlıdır.

header( 'Cache-Control: must-revalidate, pre-check=0, post-check=0' );
header( 'Cache-Control: public' );

PHP ikinci satırında completely overwrites ilki. Sen karanlıkta bıçaklama gibi görünüyor.

What really makes a difference

Content-Disposition: attachment

Özel karakterler için daha iyi destek veriyor ve {[(2 görmezden tarayıcılarda çalışır) - (Eğer mod_rewrite kullanabilir veya index.php/fakefilename.doc kandırmak orada dosya eklemek zorunda değilsiniz ]} Content-Disposition başlığı).

IE de dosya (non-önbelleklenebilecek dosyalar için doens't iş "Aç") önbellek olup olmadığını fark yapar ve kullanıcı plug-in olup olmadığını IE algılar dosya türünü desteklemek iddia ediyor.

Önbelleğini devre dışı bırakmak için sadece bir şey göndermek zorunda değilsiniz önbelleklenebilecek dosyası yapmak için Cache-control:no-cache (20 ekstra sahte başlıkları olmadan), ve ihtiyacım var.

NB: PHP has horrible misfeature called session.cache_limiter hangi umutsuzca kadar vida HTTP başlıklarını size none olarak ayarlayın unlesss.

ini_set('session.cache_limiter','none'); // tell PHP to stop screwing up HTTP

IE bazı sürümleri almak gibi görünüyor

header( 'Expires: 0' );
header( 'Cache-Control: must-revalidate, pre-check=0, post-check=0' );

onu görüntülemek için eklenti iletilen önce yol çok ciddi ve indirilen içerik kaldırmak.

Bu ikisini çıkarın ve ince olmalıdır.

Acrobat bazı sürümleri bu mücadele gibi görünüyor çünkü PDF'leri ile çalışırken herhangi bir sunucu tarafı GZIP sıkıştırma kullanarak olmadığından emin olun.

Ben burada belirsiz olduğumu biliyorum, ama yukarıdaki önerilerimiz gerçek dünya deneyimine ben barkod içeren dinamik inşa PDF'leri hizmet veren bir web uygulamasını kullanarak var dayanmaktadır. Ben etkilenen hangi sürümleri bilmiyorum, ben sadece iki "hileler" kullanarak yukarıda yapılan biliyorum destek aramaları go away: p

Ben yaklaşık bir yıl önce aynı sorunu vardı ve çok googling ve araştırma sonrasında, (Java kodu) başlıklarımda IE6 & arayın Bu gibi PDF'leri:

    response.setHeader("Content-Type", "application/pdf "; name=" + file.getName());
    response.setContentType("application/pdf");
    response.setHeader("Last-Modified", getHeaderDate(file.getFile());
    response.setHeader("Content-Length", file.getLength());

Her şeyi bırakın.

IE6, önbelleğe alma ile biraz kaçık bir şey, zorla indirilmesi ve eklentileri görünüşte vardır. Ben bu sizin için çalışır umuyoruz ... benim için küçük bir fark isteği başlangıçta bir Flash SWF dosyasından geliyor olmasıdır. Ama bu önemli değil.

Sizi bu yazı harcanan zaman takdir. Birkaç kombinasyonları denedim ve sonunda benim symfony proje çalışması lazım. Burada herkes aynı sorun var olacak durumda çözüm gönderebilir:

public function download(sfResponse $response) {

        $response->clearHttpHeaders();
        $response->setHttpHeader('Pragma: public', true);
        $response->addCacheControlHttpHeader("Cache-control","private");        
        $response->setContentType('application/octet-stream', true);
        $response->setHttpHeader('Content-Length', filesize(sfConfig::get('sf_web_dir') .       sfConfig::get('app_paths_docPdf') . $this->getFilename()), true);
        $response->setHttpHeader("Content-Disposition", "attachment; filename=\"". $this->getFilename() ."\"");
        $response->setHttpHeader('Content-Transfer-Encoding', 'binary', true);
        $response->setHttpHeader("Content-Description","File Transfer");
        $response->sendHttpHeaders();
        $response->setContent(readfile(sfConfig::get('sf_web_dir') . sfConfig::get('app_paths_docPdf') . $this->getFilename()));

        return sfView::NONE;
}

Bu IE6, IE7, Chrome, Firefox benim için gayet güzel çalışıyor.

Bu kimse yardımcı olacağını umuyoruz.

Eğer tüm kullanıcıların dosyaları indirmek için gerekli izinlere sahip olduğunu doğrulayın, ve / veya Adobe Reader çalıştırmak için?

Stu, cevap için ama ne yazık ki daha önce olduğu gibi, bu durumda aynı hatayı hile yapmadım teşekkürler. (Başka bir projede IE kullanıcıları için iyi çalıştı çünkü ben aslında sadece, önbellek başlıkları, vb ekledi önce sadece içerik türü ve kuvvet indirmeyi ayarlamak istiyorum).

Burada bizim admin konuştuk ve o aslında IE6 düzgün bazı sistem güvenlik politikasının uygulanması ile değil bir ilgisi olabileceğini düşünüyor. Aynı sistemde IE7 aslında çalışır.

Pilif zaten bahseder gibi, sunucu tarafında gzip sıkıştırmasını kapatmak için emin olun. Benim için bu (diğer türleri arasında) PDF dosyaları ile ve hem de Internet Explorer ve Firefox altında. Zip dosyaları ile de belki-so-karanlık olmayan nedenlerle sorunlara yol açtı.

Bildiğim kadarıyla söyler misiniz, zip bitişin son bit bozuk bir biçimi neden (en azından FireFox) elimden almak istiyorum.

PHP, aşağıdaki kodu kullanabilirsiniz:

ini_set("zlib.output_compression",0);

Java kodu aşağıdaki bit (Firefox 2 ve 3, IE 6 ve 7 üzerinde test) benim için çalışıyor:

response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");
response.setContentType(getServletContext().getMimeType(file.getName()));
response.setContentLength(file.length());

No other headers were necessary at all. Also, I tested this code both with gzip compression on and off (using a separate servlet filter that does the compression). Doesn't make any difference (works without any problem in the four browsers I tested it on). Plus, this works for other filetypes as well.

Sunucu çok yardımcı olabilir url okumazlar ek bir parametre ekleyebilirsiniz.

http://www.mycom.com/services/pdf?action=blahblah&filename=pdf0001.pdf

Yani başlıkların birini daha url ucunda dosya okumak için daha çok olacaktır nerede durumlarda içine çalıştırmak

Ben benzer bir sorun vardı, ama tam olarak ilişkili olmayabilir. Benim sorun IE6 dosya adında özel karakterler ile ilgili bir sorun (özellikle bölü) gibi görünüyor oldu. Bu sorunu sabit Çıkarma.

If you are using SSL:

Eğer herhangi bir önbellek denetimi (veya Pragma) başlıklarını dahil olmadığından emin olun. Önbellek denetim başlıkları kullanılması durumunda dosya indirirken kullanıcıların önleyecektir IE6 bir hata var. Onlar bir hata mesajı alırsınız.

Ben 2 gün boyunca bu aşkın saçımı çekti, bu yüzden umarım bu mesajı birisi yardımcı olur.

sadece bu içerik türüne geçiş ve bu iş olacak, ayrıca Pragma ist eşit DEĞİL şey "no-cache" olarak ayarlanmış emin olun

header( 'Content-type: application/octet-stream'); # force download, no matter what mimetype
header( 'Content-Transfer-Encoding: binary' ); # is always ok, also for plain text