2010-09-16 9 views
23

मुझे send_file (Model.attachment.path) को काम करने के लिए नहीं मिल सकता है। यह विफल नहीं होता है, इसके बजाय, यह क्लाइंट को 0 बाइट आकार फ़ाइल भेजता है, फ़ाइल नाम सही हैं।रेल भेजकर 0 बाइट फाइल भेजता है send_file

यह समस्या हो रहा शुरू कर दिया बाद मैं 3.

अन्य चीजें हैं जो इस प्रवास में जगह ले ली है और मैं विस्तार पर उन सभी को मेरी पूरी कोशिश करेंगे की एक बहुत कुछ कर रहे थे करने के लिए रेल 2.3.8 से एक बड़ा पलायन किया था ।

  1. विघटन परिवर्तन/सर्वर परिवर्तन। रैकस्पेस RHEL5 linode को उबंटू 10.04LTS
  2. रूबी संस्करण परिवर्तन, 1.8.6 -> 1.9.2
  3. रेल संस्करण परिवर्तन, 2.3.8 -> 3.0.0
  4. httpd मंच परिवर्तन, apache2 -> nginx (हालांकि मैंने apache2 पर भी कोशिश की और यह काम नहीं किया)।

मैं FTP के माध्यम से संलग्नक ले जाया गया, के रूप में वे मेरे Git संग्रह का हिस्सा है ताकि वे टोपी तैनाती के माध्यम से प्रकाशित किए गए थे नहीं थे बजाय मैन्युअल एफ़टीपी दूरस्थ (RHEL5) दूरस्थ करने के लिए स्थानीय (Win7) तो स्थानीय (Win7) से (Ubuntu10)।

मुझे पता है कि एफ़टीपी स्थानांतरण स्थानान्तरण के माध्यम से फ़ाइल अनुमतियों को बरकरार नहीं रखता है, इसलिए मैंने जो भी किया है, वह मेरे पिछले सर्वरों पर देखे गए chmods की नकल करता है, इसलिए वे लगभग समान हैं। (उपयोगकर्ता/समूह अलग हैं, रूट पर सेट करें: olduser के बजाय रूट: olduser)।

मेरे उत्पादन लॉग से अनुलग्नक डाउनलोड करने के अनुरोध का एक स्निपेट।

Started GET "/attachments/replies/1410?1277105698" for 218.102.140.205 at 2010-09-16 09:44:31 +0000 
    Processing by AttachmentsController#replies as HTML 
    Parameters: {"1277105698"=>nil, "id"=>"1410"} 
Sent file /srv/app/releases/20100916094249/attachments/replies/UE0003-Requisition_For_Compensation_Leave.doc (0.2ms) 
Completed 200 OK in 78ms 

सब कुछ ठीक है। मुझे स्थानीय मुद्दों को भी रद्द करने दें, मैंने Win7 और Ubuntu (Vbox पर) दोनों पर क्रोम के माध्यम से डाउनलोड करने का प्रयास किया है।

मुझे यह भी आश्वस्त करने दें कि पथ वास्तव में सही है।

[email protected]:/srv/app/current# tail /srv/app/releases/20100916094249/attachments/replies/UE0003-Requisition_For_Compensation_Leave.doc 
# 
    # 
     %17nw 
       HQ��+1ae���� 
              %33333333333(��QR���HX�"%%��@9 
��@�p4��#[email protected]��Unknown������������G��z �Times New Roman5��Symbol3&� 
         �z �Arial5&� 

तो सवाल, मैं कैसे send_file वास्तव में नकली 0 बाइट कबाड़ के बजाय फ़ाइलें भेजने के लिए मिलता है योग करने के लिए। पथ के साथ एक्स Sendfile हेडर के साथ खाली प्रतिक्रिया लौटाएँ, अपाचे (mod_xsendfile के साथ) या lighttpd -

उत्तर

45

send_file:x_sendfile परम जो रेल 3. यह सुविधा में true को चूक offloads सामने सर्वर से स्ट्रीमिंग डाउनलोड है।

Nginx ही कार्यक्षमता के लिए X-Accel-Redirect हेडर का उपयोग करता है, लेकिन आप ठीक ढंग से कॉन्फ़िगर रेल उचित माहौल फ़ाइल में करने के लिए है:

config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' 

रेल 3 अद्यतन: इस लाइन पहले से ही production.rb में मौजूद है, बस इसे टिप्पणी हटाएं।

रेल द्वारा भेजे गए हेडर का उपयोग करने के लिए अपने nginx कॉन्फ़िगरेशन में sendfile on; जोड़ें। याद रखें कि पूर्ण पथ का उपयोग किया जाना चाहिए और nginx को फ़ाइल तक पहुंच पढ़ने चाहिए।

एक और तरीका है aliased फ़ाइलों के लिए:

बेहतर सुरक्षा के लिए मैं बजाय nginx पूर्ण पथ में कल्पित नामों का प्रयोग, तथापि send_file विधि चेकों फ़ाइल के अस्तित्व जो उर्फ ​​साथ विफल रहता है। इस प्रकार मैं अपने कार्रवाई बदल दिया है:

head(
     'X-Accel-Redirect'=> file_item.location, 
     'Content-Type' => file_item.content_type, 
     'Content-Disposition' => "attachment; filename=\"#{file_item.name}\""); 
    render :nothing => true; 
+2

के रूप में यात्री 5 पर बहुत अच्छा काम करता है, मैंने वास्तव में कल समाधान का पता लगाया और आज इसके बारे में ब्लॉग किया http://www.novafist.com/2010/09/send_file-sends-0- बाइट्स-टू-क्लाइंट-इन-रेल/ – fivetwentysix

+2

config.action_dispatch.x_sendfile_header = 'एक्स-एक्सेल-रीडायरेक्ट' हेड() से भी बेहतर है। – gertas

+0

उत्तर के लिए धन्यवाद, मुझे कुछ समय बचाया! –

18

रेल 3 में, बस लाइनproduction.rb में config.action_dispatch.x_sendfile_header = 'एक्स-एक्सेल-पुनर्निर्देशन' अंदर फ़ोल्डर वातावरण uncomment।

3

मुझे send_dile() के साथ अतीत में समान समस्याएं थीं, तो send_data() का उपयोग करके मुझे वापस सहेजा गया (उदाहरण के लिए send_data फ़ाइल.read (फ़ाइल नाम),: disposition => 'inline',: type => " कुछ/mimetype ")

+0

इसके लिए धन्यवाद, मुझे बहुत समय डिबगिंग बचाएं क्योंकि मैं कॉन्फ़िगरेशन पर टिप्पणी नहीं करना चाहता था। – covard

14

हां, मुझे रेल-3 में डिफ़ॉल्ट रूप से X-sendfile को सक्षम करने में भी यही समस्या थी।

आप "send_file" कॉल, तुम सिर्फ टिप्पणी बाहर निकल सकते हैं config/वातावरण/production.rb में लाइन निम्न में से बड़ी मात्रा में है, तो:

#config.action_dispatch.x_sendfile_header = "X-Sendfile" 

फिर send_file विधि पूरी तरह से काम करना शुरू किया।

क्योंकि मैं अपाचे में एक्स-प्रेषण एक्सटेंशन इंस्टॉल नहीं कर सकता, मैंने अभी थोड़ा खोजा और इसे पाया।

मुझे उम्मीद है कि यह मदद करता है।

+0

अपाचे पर स्थापित करने से यह मेरी समस्या को तुरंत साफ़ कर देता है। अच्छी तरह से मिला –

0

रेल 4, पर मुझे एहसास हुआ कि मेरी समस्या यह है कि मैंने अस्थायी फ़ाइल को हटा दिया जो उपयोगकर्ता को भेजने के लिए उत्पन्न हुआ।

अगर मैंने फ़ाइल को हटाया नहीं है, send_file काम करता है। ive पतली पर परीक्षण नहीं किया गया है लेकिन यह स्टैंडअलोन सर्वर

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