2014-11-03 4 views
6

का उपयोग कर फ़ाइल डाउनलोड करते समय समस्या हो रही है, मैं चाहता हूं कि मेरे प्रोग्राम को पॉप-अप फ़ाइल डाउनलोड शुरू होने से पहले विंडो विकल्प के रूप में सहेजें, हालांकि जब मैं अपना सर्वलेट चलाता हूं तो यह स्वचालित रूप से फ़ाइल डाउनलोड करना प्रारंभ करता है। मुझे यहां क्या समझ नहीं आ रहा है ?सामग्री-स्वभाव

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    ServletOutputStream outputStream = response.getOutputStream(); 
    FileInputStream fis=new FileInputStream("E:/sound.mp3"); 
    response.setContentLength(fis.available()); 
    response.setContentType("audio/basic"); 
    response.addHeader("content-disposition", "attachment;filename=abc.mp3"); 
    while(true){ 
     int read = fis.read(); 
     if(read==-1)break; 
     outputStream.write(read); 
    } 
    fis.close();   
} 
+0

मेरा मानना ​​है कि यह सर्वर की तरफ है। आप क्लाइंट साइड में सर्वर ईवेंट को प्रचारित करने का प्रयास कर रहे हैं। – christopher

+0

यहां देखें: http://stackoverflow.com/questions/3802510/force-to-open-save-as-popup-open-at-text-link-click-for-pdf-in-html और http: //stackoverflow.com/questions/2226192/generate-some-xml-in-javascript-prompt-user-to-save-it सम्मान –

+1

@ DaniloMuñoz: जैसा कि मैं देख सकता हूं कि एवोब दो परिदृश्य अलग-अलग रूप हैं .. लेकिन चिंता के लिए धन्यवाद –

उत्तर

6

आपका प्रोग्राम डेस्कटॉप/स्टैंडअलोन नहीं है, क्योंकि यह सर्वर पर चलने वाला सर्वलेट है। जब आप इसे ग्रहण में दाएं क्लिक करके और run as ->run on server पर चलाते हैं, तो ग्रहण वास्तव में परिणामों को प्रदर्शित करने के लिए एक वेब पेज खोलता है। इसलिए, आपका प्रोग्राम अब एक वेब अनुप्रयोग है, और ग्रहण (या जो पृष्ठ खुलता है) क्लाइंट है। क्लाइंट आपके द्वारा भेजी गई जानकारी को सहेज रहा है, न कि आपका प्रोग्राम। समझ गया?

content-disposition शीर्षलेख केवल डाउनलोड के फ़ाइल नाम का सुझाव देने के लिए है। ब्राउज़र सेटिंग्स परिभाषित करती हैं कि क्या यह खुल जाएगा विंडो या नहीं। आप इसे नियंत्रित नहीं कर सकते।

उदाहरण के लिए, Google क्रोम में, Setting/Advanced Setting/Downloads में, विकल्प Ask where to save each file before downloading है। केवल अगर यह विकल्प चुना गया है तो यह आपके द्वारा इच्छित संवाद को खोल देगा। अन्यथा यह इसे एक डिफ़ॉल्ट स्थान में सहेज लेगा (ब्राउज़र सेटिंग्स में भी परिभाषित)। सभी ब्राउज़रों के लिए इसी तरह के विकल्प मौजूद हैं।

भी कृपया ध्यान दें कि, content-type हैडर के आधार पर, ब्राउज़र प्रदर्शन सामग्री के लिए नहीं डाउनलोड यह प्रयास करें, और होगा। उदाहरण के लिए, ब्राउज़र ग्रंथों और एचटीएमएल को प्रदर्शित करने का प्रयास करेगा। लेकिन फिर आप कर सकते हैं बल एक गैर प्रदर्शन योग्य प्रकार के शीर्ष लेख की स्थापना करके डाउनलोड:

response.setContentType("application/octet-stream");

मामले में आप एक वेब एप्लिकेशन बनाने के लिए नहीं करना चाहती: आपके प्रोग्राम एक सर्वर पर चलाता है के बाद से, यह बस जानकारी भेजता है और किया जाता है। यह क्लाइंट प्रोग्राम है जो यह तय करता है कि इसके साथ क्या करना है। आपके वर्तमान मामले में ग्राहक एक ब्राउज़र है (या ग्रहण पृष्ठ खोलने वाला ग्रहण)। content-disposition शीर्षलेख जैसे शीर्षलेख ब्राउज़र के उद्देश्य से हैं। यदि आप अपना खुद का क्लाइंट (स्विंग क्लाइंट, एंड्रॉइड ऐप, आईफोन ऐप) बनाना चाहते हैं जो ब्राउज़र नहीं है, तो क्लाइंट सर्वर से जानकारी प्राप्त करेगा और तय करेगा कि इसके साथ क्या करना है (इसे प्रदर्शित करें, या इसे किसी भी में सहेजें रास्ता), यहां तक ​​कि HTTP शीर्षलेखों को अनदेखा कर रहा है।

+0

बहुत बहुत धन्यवाद। आपने इसे अच्छी तरह समझाया। –

-1

आपको मैन्युअल रूप से संवाद को लागू करना होगा, उदा। (http://docs.oracle.com/javase/7/docs/api/javax/swing/JFileChooser.html)। फ़ाइल का चयन करने के बाद, आप http अनुरोध डाउनलोड (अपने सर्वलेट में) शुरू कर पाएंगे और फ़ाइल को वांछित पथ पर सहेज सकेंगे।

2

यहाँ देखने का प्रयास करें: http://www.java2s.com/Code/Java/Swing-JFC/DemonstrationofFiledialogboxes.htm

उनके कोड में मुख्य बयान बाहर ले और अपने खुद के कोड में run(new FileChooserTest(), 250, 110); डाल दिया। अगर मैं इसे कर रहा था, तो मैं saveStatus और 3 फाइनल के बराबर 0, 1, और 2 के बराबर waiting, save, और cancel नामक एक इंटी बनाउंगा। तो मैं आपके प्रोग्रामिंग में थोड़ी देर लूप करूंगा ताकि यह देखने के लिए कि saveStatus आपके प्रोग्राम को रोकने के लिए waiting के बराबर था (लेकिन संवाद नहीं)। इसके बाद, मैं यह देखने के लिए एक if स्टेटमेंट बनाउंगा कि saveStatussave के बराबर था या नहीं। यदि ऐसा है, तो इसे डाउनलोड करें, और यदि नहीं, तो नहीं। इतना ही आसान।

2

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

मुझे लगता है कि अधिकांश समाधान डाउनलोड लिंक से पहले पृष्ठ पर जावास्क्रिप्ट का उपयोग करते हैं।