2013-04-01 5 views
6

मेरे पास एक वेब ऐप है जो उपयोगकर्ताओं को पीडीएफ फ़ाइल डाउनलोड करने देता है। यह एएसपी.नेट एमवीसी है और यह सभी डेस्कटॉप ब्राउज़र, आईफोन, एंड्रॉइड क्रोम, और देशी एंड्रॉइड ऐप पर ठीक काम करता है जो वेब व्यू सेटडाउनलोड लिस्टर() को ओवरराइड करता है।एंड्रॉइड ब्राउज़र पीडीएफ फ़ाइल डाउनलोड नहीं करेगा

हालांकि, डिफ़ॉल्ट एंड्रॉइड ब्राउज़र का उपयोग करते समय डाउनलोड काम नहीं लगता है। मैं एक गैलेक्सी नेक्सस 4.2.2 पर चल रहा है और नेक्सस एस 4 जी पर 2.3.7 चल रहा हूं। मेरे पास दोनों डिवाइसों पर पीडीएफ व्यूअर ऐप्स इंस्टॉल हैं।

जब मैं एंड्रॉइड क्रोम में परीक्षण करता हूं, तो उपयोगकर्ता "प्रारंभ करना डाउनलोड ..." टोस्ट देखता है और फिर स्टेटस बार में डाउनलोड पूर्ण सूचना दिखाई देती है। उपयोगकर्ता पीडीएफ दर्शक में फ़ाइल खोलने के लिए इस अधिसूचना को स्पर्श कर सकता है। एंड्रॉइड के डिफ़ॉल्ट ब्राउज़र में कोई टोस्ट नहीं है और कोई डाउनलोड फ़ाइल सहेजी नहीं जाती है।

मैं नेटवर्क पर wireshark रख दिया और मैं निम्नलिखित अनुरोध देखें:

GET /appapth/ViewPDF/8383600280757433_11_05_2012 HTTP/1.1 
Host: 192.168.1.117 
Connection: keep-alive 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
X-Requested-With: com.google.android.browser 
User-Agent: Mozilla/5.0 (Linux; U; Android 4.2.2; en-us; Galaxy Nexus Build/JDQ39) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 
Accept-Encoding: gzip,deflate 
Accept-Language: en-US 
Accept-Charset: utf-8, iso-8859-1, utf-16, *;q=0.7 
Cookie: (lots o'cookie data) 

और प्रतिक्रिया है:

HTTP/1.1 200 OK 
Cache-Control: no-cache, no-store, must-revalidate 
Pragma: no-cache 
Content-Type: application/pdf 
Content-Encoding: gzip 
Expires: -1 
Server: Microsoft-IIS/7.5 
Set-Cookie: ___TempData=; path=/ 
Set-Cookie: ___TempData=(lot's o'cookie data); path=/; HttpOnly 
Date: Mon, 01 Apr 2013 18:22:20 GMT 
Content-Length: 48244 

......YQ.....T...?J.h)...!E.S(lots o'binary data) 

आप का पता लगाने आवेदन/पीडीएफ सामग्री डाउनलोड किया जाता है से देख सकते हैं। आप यह भी देख सकते हैं कि मैं सामग्री-स्वभाव हेडर का उपयोग नहीं कर रहा हूं और प्रतिक्रिया gzip एन्कोडिंग के साथ डाउनलोड की गई है।

यह कोई विचार नहीं है कि यह डिफ़ॉल्ट एंड्रॉइड ब्राउज़र पर क्यों काम नहीं करता है? उपयोगकर्ता को डाउनलोड किए गए डेटा तक पहुंच नहीं है और कोई दर्शक (या इरादा) लॉन्च नहीं किया गया है। प्रतिक्रिया सिर्फ चुपचाप अनदेखा है। (मेरा अनुमान है कि है कि Android डिफ़ॉल्ट ब्राउज़र सामग्री-विन्यास की आवश्यकता है या डाउनलोड पर Gzip की तरह नहीं है, लेकिन मैं सिर्फ अनुमान लगा रहा हूँ)

अद्यतन ----

मैं हमारे कार्रवाई फिल्टर हटा दिया कि Gzip संपीड़न को कार्यान्वित कर रहा था और मैंने सामग्री-डिस्पोजिशन अटैचमेंट हेडर में जोड़ा। तो, मेरे नियंत्रक में MVC कोड की तरह है:

public virtual ActionResult ViewPDF(string id) 
{ 
    try 
    { 
     byte[] pdf = GetPDFContent(id); 
     FileContentResult fcr = new FileContentResult(pdf, "application/pdf"); 
     fcr.FileDownloadName = id + ".pdf";    
     return fcr; 
    } 

और HTTP प्रतिक्रिया है:

HTTP/1.1 200 OK 
Cache-Control: no-cache, no-store, must-revalidate 
Pragma: no-cache 
Content-Type: application/pdf 
Expires: -1 
Server: Microsoft-IIS/7.5 
Content-Disposition: attachment; filename=433_07_05_2012.pdf 
Set-Cookie: ___TempData=; path=/ 
Set-Cookie: ___TempData=(lots o'cookie data);path=/; HttpOnly 
Date: Mon, 01 Apr 2013 19:56:07 GMT 
Content-Length: 59069 

%PDF-1.3 %.... 13 0 obj << (lots o'binary pdf data) 

वहाँ अब कोई gzip है और वहाँ एक सामग्री स्वभाव है, लेकिन एंड्रॉयड डिफ़ॉल्ट पर ब्राउजर अभी भी कोई दृश्य डाउनलोड नहीं है।

अद्यतन 2 ---

https://stackoverflow.com/a/5728859/90236 और http://winzter143.blogspot.com/2012/03/android-handling-of-content-disposition.html और http://androidforums.com/application-development/256987-android-phone-download-issue-asp-net-website.html से सुझाव की कोशिश की लेकिन मैं अभी भी एक ही परिणाम मिलता है।

+0

मैं एक ही समस्या है। स्टॉक एंड्रॉइड ब्राउज़र और डॉल्फिन ब्राउज़र डाउनलोड करने में विफल रहता है। अन्य ब्राउज़रों में कोई समस्या नहीं है।मैंने आपके द्वारा लिंक किए गए सभी सुझावों का भी प्रयास किया है। –

+0

मेरा जवाब मिला। मुझे उम्मीद है इससे आपको मदद मिली होगी। मैं एक आईफ्रेम में डाउनलोड कर रहा था और एंड्रॉइड ब्राउज़र ऐसा प्रतीत नहीं होता था। पर लक्ष्य = "_ खाली" जोड़ें और अब यह काम करता है। –

+0

दुर्भाग्यवश यह मेरे लिए लागू नहीं होता है - मैं फॉर्म पोस्ट के माध्यम से एक नियंत्रक कार्रवाई में अपना डाउनलोड शुरू करता हूं जो फ़ाइलस्ट्रीम रीसेट देता है। –

उत्तर

3

मेरा अपना जवाब मिला और यह कहां से देख रहा था उससे कहीं अधिक सरल था। डाउनलोड लिंक वाला मेरा पेज आईफ्रेम में है। एंड्रॉइड डिफ़ॉल्ट ब्राउज़र में कुछ अगर आपके आईफ्रेम में होता है तो आपका डाउनलोड खो देता है। मैंने एक टैग में लक्ष्य = "_ खाली" जोड़ा जो डाउनलोड शुरू करता है और सब कुछ ठीक काम करता है।

समस्या और फिक्स को प्रदर्शित करने के लिए यहां कुछ नमूना कोड दिए गए हैं।

<html> 
<head><title>Test page</title></head> 
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE"> 
<body> 
    <a href="http://www.adobe.com/products/eulas/pdfs/Photoshop_On_a_Server_Policy_5-31-2011.pdf"> 
     Download sample pdf</a><br /> 
    <iframe src="inner.html" /> 
</body> 
</html> 

और inner.html:

<html> 
<head><title>test iframe</title></head> 
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE"> 
<body> 
    <p>This does NOT work on Android default browser. 
    <a href="http://www.adobe.com/products/eulas/pdfs/Photoshop_On_a_Server_Policy_5-31-2011.pdf"> 
    Download sample pdf within iframe</a></p> 

    <p><a href="http://www.adobe.com/products/eulas/pdfs/Photoshop_On_a_Server_Policy_5-31-2011.pdf" 
    target="_blank">Download sample pdf within iframe with target</a>.</p> 
</body> 
</html> 
संबंधित मुद्दे