2008-12-28 17 views
21

मैं ऐसी साइट को क्रेट करने की कोशिश कर रहा हूं जो उपयोगकर्ताओं को अपनी पसंद के किसी फ़ाइल प्रकार को अपलोड करने की अनुमति देता है। मैंने इस सुविधा को ठीक से कार्यान्वित किया है, और फ़ाइल सर्वर पर आयोजित की जाती है। बाद में वे फ़ाइल को देखने के लिए डाउनलोड कर सकते हैं, लेकिन मुझे इसे काम करने में परेशानी हो रही है।

मैंने किसी भी उदाहरण का उपयोग किया है जिसे मैं पकड़ सकता हूं लेकिन वे सभी पाठ फ़ाइलों को उदाहरण के रूप में उपयोग करते हैं। मेरी समस्या यह है कि पीडीएफ और कई अन्य फाइल प्रकार ठीक से डाउनलोड नहीं हो रहे हैं। वे ठीक डाउनलोड करने लगते हैं, लेकिन फाइलों में से कोई भी सफलतापूर्वक खुल जाएगा। फ़ाइलों की तुलना में, ऐसा लगता है कि अधिकांश फाइल सामग्री सही है, लेकिन कुछ हिस्सों में नहीं हैं।Grails फ़ाइल डाउनलोड करें

def file = new File(params.fileDir)  
response.setContentType("application/octet-stream") 
response.setHeader("Content-disposition", "filename=${file.getName()}") 
response.outputStream << file.text 
return 

इस कोड को एक नियंत्रक जो एक डाउनलोड लिंक द्वारा कहा जाता है के अंदर आयोजित किया जाता है:

यहाँ मेरी ग्रूवी कोड है। मैंने विभिन्न सामग्री प्रकारों के साथ खेलने की कोशिश की है, लेकिन मुझे नहीं पता कि मैं किसी भी प्रकार के लिए किस प्रकार उपयोग कर सकता हूं - क्या कोई है? जो भी मैं कोशिश करता हूं वह समस्या को हल नहीं करता है।

आपकी मदद के लिए धन्यवाद।

उत्तर

41

समस्या यह है कि आप "file.text" का उपयोग करके फ़ाइल की सामग्री को स्ट्रिंग में पढ़ते हैं। फ़ाइल की सामग्री को सिस्टम वर्ण एन्कोडिंग के साथ परिवर्तित किया जाता है, भले ही सामग्री द्विआधारी है, पाठ नहीं (उदाहरण के लिए पीडीएफ फाइलें बाइनरी हैं) और प्रतिक्रिया एन्कोडिंग का उपयोग करके क्लाइंट को भेजी जाती हैं और इस प्रकार बाइनरी सामग्री को संशोधित करती हैं। आपको इसके बजाय एक अलग दृष्टिकोण का उपयोग करना चाहिए:

def file = new File(params.fileDir)  
response.setContentType("application/octet-stream") 
response.setHeader("Content-disposition", "attachment;filename=${file.getName()}") 

response.outputStream << file.newInputStream() // Performing a binary stream copy 
+0

अच्छा एक धन्यवाद। मैं .text विधि का उपयोग कर रहा था लेकिन यह नहीं पता था कि यह वास्तव में क्या कर रहा था - इस पर कोई दस्तावेज नहीं मिला:/ –

+0

आप ग्रोवी जेडीके के अंदर प्रलेखन पा सकते हैं (जावा एसडीके में गतिशील एक्सटेंशन का एक दस्तावेज ग्रूवी)। इस मामले में यह java.io.File.getText() विधि है जिसे लागू किया जाता है: http://groovy.codehaus.org/groovy-jdk/java/io/File.html#getText() –

+0

क्या कोई है पता है कि कई फाइलों को प्रतिक्रिया में कैसे रखा जाए? कोई परीक्षा? –

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