2017-02-27 7 views
8

मैं फ़ाइल डाउनलोड ट्रिगर करने की कोशिश कर रहा हूं, और मुझे सफारी पर ऐसा करने में समस्याएं हैं (फ़ायरफ़ॉक्स & क्रोम काम करता है)।फ़ाइल डाउनलोड करें सफारी

@RequestMapping(method = RequestMethod.GET, produces = "text/csv") 
    @ResponseBody 
    public String getReports(
     final HttpServletResponse response, 
     final @RequestParam String data) throws ParseException { 
    response.setHeader("Content-type", "text/csv; charset=utf-8"); 
    response.setHeader("Content-Disposition","attachment; filename='view.csv'"); 
    String csv = exportCurrentService.extractMatrix(data); 
    response.setContentLength(csv.length()); 

    return csv; 
    } 

और यहाँ मेरे मुवक्किल कोड है::

downloadURI(url, name) { 
    const a = document.createElement('a'); 
    a.href = url; 
    a.download = name; 
    document.body.appendChild(a); 
    a.click(); 
    document.body.removeChild(a); 
    } 

सफारी में प्रतिक्रिया स्क्रीन (एक ही पृष्ठ पर लोड) पर बाहर छपा है
यहाँ मेरी जावा कोड है।

नोट: मैंने SO पर सुझाए गए अन्य तरीकों का प्रयास किया है लेकिन प्रत्येक की अपनी समस्याएं हैं।

अपडेट: प्रतिक्रिया शीर्षलेख में मैं देखता हूं कि सामग्री-डिस्पोजिशन अनुलग्नक के बजाय इनलाइन पर सेट है। यह क्यों हो रहा है?

मैंने क्या गलत किया?

+0

क्या आप अनुरोध और प्रतिक्रिया शीर्षलेख प्राप्त करने के लिए सफारी में वेब इंस्पेक्टर का उपयोग कर सकते हैं, और उन्हें अपने प्रश्न में जोड़ सकते हैं? – Stobor

+0

'सामग्री-प्रकार: टेक्स्ट/सीएसवी' को 'सामग्री-प्रकार: एप्लिकेशन/ऑक्टेट-स्ट्रीम' में बदलने के लिए आपके लिए कुछ भी बदल रहा है? – d3L

+0

यह डाउनलोड करता है लेकिन फ़ाइल एक्सटेंशन और फ़ाइल नाम के बिना (सभी ब्राउज़रों में) – vlio20

उत्तर

0

मेरी सेवा एक मार्ग मॉड्यूल के पीछे रखा गया है (जो सभी सूक्ष्म सेवाओं के लिए प्रॉक्सी है)। यह मुद्दा इस मॉड्यूल (प्रॉक्सी) में था, यह माइक्रो ऐप सेवा के हेडर और कुकीज़ को ओवरराइट कर रहा था।

प्रश्न में वर्णित कोड को सेट करना चाल था।

1

यह संकलित नहीं होगा, यह केवल दर्शाता है कि आपको क्या करना चाहिए।

response.setContentType("application/force-download"); 
response.setContentLength((int)f.length()); 
     //response.setContentLength(-1); 
response.setHeader("Content-Transfer-Encoding", "binary"); 
response.setHeader("Content-Disposition","attachment; filename=\"" + "xxx\"");//fileName); 
... 
... 
File f= new File(fileName); 

InputStream in = new FileInputStream(f); 
BufferedInputStream bin = new BufferedInputStream(in); 
DataInputStream din = new DataInputStream(bin); 

while(din.available() > 0){ 
    out.print(din.readLine()); 
    out.print("\n"); 
    //this is from another answer I saw awhile ago while trying to do the same thing 
} 

यह एक और पोस्ट से है जिसे मैंने एक ही काम करने की कोशिश करते समय देखा था। मूल लेखक विनीत रेनॉल्ड्स था। मैं SO के लिए नया हूं इसलिए कृपया मुझे सूचित करें कि यह बुरा अभ्यास है या नहीं।

1

@ResponseBody बिना प्रयास करें और साथ produces = MediaType.APPLICATION_JSON_UTF8_VALUE

+0

लेकिन मैं इसे एक सीएसवी के रूप में चाहता हूं, जेसन – vlio20

+0

आप अपने प्रकार (टेक्स्ट/सीएसवी) के साथ प्रयास कर सकते हैं। @ResponseBody एनोटेशन के साथ आप सामग्री-प्रकार शीर्षलेख सेट कर रहे हैं टेक्स्ट/सादा। इस पर एक नज़र डालें: http://stackoverflow.com/a/30549204/7604006 – NikNik

+0

मैंने कोशिश की है लेकिन ऐसा लगता है कि सामग्री-विस्थापन इनलाइन पर सेट है, (मैं इसे देव-उपकरण में देखता हूं प्रतिक्रिया हेडर)। – vlio20

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