2012-03-12 18 views
9

पर प्रोन का उपयोग हम वर्तमान में हेरोकू पर होस्ट किए गए रेल एप्लिकेशन पर काम कर रहे हैं। हम एक पीडीएफ उत्पन्न करने की कोशिश कर रहे हैं और इसे डाउनलोड करने के लिए उपयोगकर्ता को धक्का दे रहे हैं।हेरोकू

हम पीडीएफ पीढ़ी को संभालने के लिए प्रोन का उपयोग कर रहे हैं।

पीडीएफ पैदा करने के लिए हमारे कोड वर्तमान में है:

Prawn::Document.generate @name[0]+ ".pdf" do 

हमारे कोड के सभी इसके बाद दस्तावेज़ उत्पन्न करने के लिए। दुर्भाग्यवश, यह दस्तावेज़ को उस डिस्क पर सहेजता है जो संभव नहीं है (मेरे ज्ञान का सबसे अच्छा) Heroku पर होस्ट किए गए अनुप्रयोगों के लिए।

हम तो

send_file "#{Rails.root}/"[email protected][0]+ ".pdf", :type => 
'application/pdf',:filename => @name[0]+ ".pdf" 

वहाँ पहले डिस्क पर दस्तावेज़ बिना सहेजे झींगा का उपयोग कर सीधे उपयोगकर्ता के लिए दस्तावेज़ के डाउनलोड पुश करने के लिए कोई तरीका है का उपयोग कर उपयोगकर्ता के लिए धक्का? यदि नहीं, तो क्या पीडीएफ उत्पन्न करने के लिए कोई अन्य रत्न हैं जिन्हें फ़ाइल भेजने से पहले फ़ाइल को डिस्क में सहेजने की आवश्यकता नहीं है?

उत्तर

7

ऐस्पन/बांस पर, आप अपनी एप्लिकेशन निर्देशिका (संभवतः Rails.root.join("tmp")) या किसी उपनिर्देशिका में tmp/ निर्देशिका में डिस्क को फ़ाइल में सहेज सकते हैं।

सीडर पर, आप फ़ाइल को अपनी एप्लिकेशन निर्देशिका में कहीं भी डिस्क पर सहेज सकते हैं, लेकिन आपको अभी भी अपने एप्लिकेशन की tmp/ निर्देशिका की उपनिर्देशिका चुननी चाहिए।

किसी भी मामले में, सहेजी गई फ़ाइलें क्षणिक हैं। वे आपके आवेदन के दो चल रहे उदाहरणों के बीच साझा नहीं किए जाते हैं; वे पुनरारंभ के बीच नहीं रखा जाता है; आदि फ़ाइल को एक अनुरोध में सहेजने पर भरोसा न करें और फिर दूसरे अनुरोध में इसे एक्सेस करने में सक्षम न हों।

+0

मेमोरी में प्रस्तुत करने के लिए फ़ाइल नाम के बिना प्रॉन का उपयोग करने के बारे में अन्य टिप्पणी देखें। – kwerle

5

हालांकि इसका उत्तर बहुत पहले दिया गया था, लेकिन मैं उन लोगों के लिए पोस्ट करूंगा जो ऐसा करना चाहते हैं।

आप वर्तमान प्रोन v0.13.2 में कोई फ़ाइल नाम के साथ render पर भी कॉल कर सकते हैं। एक स्ट्रिंग वापस कर दी जाएगी, जिसे क्लाइंट को send_data के साथ भेजा जा सकता है। पैटर्न है:

pdf = Prawn::Document.new 
# ... calls to build the pdf 
send_data pdf.render, 
      type: 'application/pdf', 
      filename: 'download_filename.pdf', 
      disposition: :inline 

यह ब्राउज़र में पीडीएफ प्रदर्शित करेगा। यदि आप इसके बजाय उपयोगकर्ता को डाउनलोड करना चाहते हैं, तो , disposition: :inline

बेशक आप केवल यह करना चाहते हैं यदि दस्तावेज़ उचित रूप से छोटा है या आपके सिस्टम का भारी उपयोग नहीं किया जाता है क्योंकि यह उपयोगकर्ता के डाउनलोड को पूरा होने तक रैम का उपभोग करेगा।

+0

मुझे लगता है कि एक चुनौती Heroku द्वारा लगाई गई 30 दूसरी अनुरोध सीमा हो सकती है। यदि फ़ाइल प्रोसेसिंग 30 सेकंड से अधिक समय लेती है - तो एक मौका है कि आवेदन 500 के साथ असफल हो जाएगा। – tamersalama

+0

@ टाइमरसामा हालांकि यह सच है, ओपी का मूल समाधान इस कारण से इस कारण से असफल रहा होगा क्योंकि लिखना और फिर फ़ाइल पढ़ना धीमा है स्मृति में बफरिंग। मैं बस दिखा रहा था कि फ़ाइल I/o से बचना संभव है। – Gene

+0

सहमत हैं - बस आपके उत्तर कोज़ पर टिप्पणी कर रहा था मुझे यह पसंद है :) – tamersalama