2012-07-18 33 views
5

मैं वीडियो होस्ट करने के प्राथमिक फोकस के साथ एक वेब एप्लिकेशन होस्ट करने के लिए heroku का उपयोग कर रहा हूं। वीडियो vimeo pro के माध्यम से होस्ट किए जाते हैं, और मैं अपलोड प्रक्रिया को संभालने में सहायता के लिए vimeo gem by matthooks का उपयोग कर रहा हूं। छोटी फ़ाइलों के लिए काम अपलोड करता है, लेकिन बड़े लोगों के लिए नहीं (~ 50 एमबी, उदाहरण के लिए)।Heroku (विशेष रूप से वीडियो) पर बड़ी फ़ाइलें अपलोड करने के लिए कैसे करें

हेरोकू लॉग पर एक नज़र से पता चलता है कि मुझे http त्रुटि 413 मिल रहा है, जिसका अर्थ है "अनुरोध इकाई बहुत बड़ी है।" मेरा मानना ​​है कि इसे एक सीमा के साथ करना पड़ सकता है कि उसके अपलोड फ़ाइल पर हुकोकू (30 एमबी से अधिक, according to this webpage) पर रखता है। समस्या यह है कि इस विषय पर मुझे जो भी जानकारी मिल सकती है वह पुरानी और विरोधाभासी प्रतीत होती है (इस पृष्ठ की तरह claims there is no size limit)। मुझे इसके बारे में हरोकू की साइट पर कुछ भी नहीं मिला।

मैंने Google की खोज की है और कुछ हद तक प्रासंगिक पृष्ठ (one और two) पाया है, लेकिन मेरे लिए कोई समाधान नहीं हुआ है। मुझे लगता है कि अधिकांश पेजों को बड़ी फ़ाइलों को अमेज़ॅन एस 3 में अपलोड करने के साथ सौदा किया गया है, जो कि मैं जो करने की कोशिश कर रहा हूं उससे अलग है।

2012-07-18T05:13:31+00:00 heroku[nginx]: 152.3.68.6 - - [18/Jul/2012:05:13:31 +0000] 
    "POST /videos HTTP/1.1" 413 192 "http://neoteach.com/components/19" "Mozilla/5.0 
    (Macintosh; Intel Mac OS X 10.7; rv:13.0) Gecko/20100101 Firefox/13.0.1" neoteach.com 

लॉग में कोई अन्य त्रुटियों के होते हैं:

यहाँ लॉग के प्रासंगिक उत्पादन है। यह एकमात्र आउटपुट है जो तब दिखाई देता है जब मैं एक वीडियो अपलोड करने का प्रयास करता हूं जो बहुत बड़ा होता है। जिसका अर्थ है कि यह एक टाइमआउट त्रुटि या प्रति dyno आवंटित स्मृति से अधिक समस्या के साथ एक समस्या नहीं है।

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

यदि समस्या अपलोड आकारों पर सीमित नहीं है, तो क्या किसी को यह पता है कि और क्या गलत हो रहा है?

बहुत धन्यवाद!

+0

जहां तक ​​मुझे पता है, ऐसा कोई रास्ता नहीं है। मुझे सीधे एस 3 पर अपलोड करना पड़ा। हो सकता है कि आप वीडियो को सीधे Vimeo पर पास करने का कोई तरीका ढूंढ सकें, लेकिन इसके लिए मुझे मिलने वाला एकमात्र परिणाम बहुत उत्साहजनक नहीं था: http://vimeo.com/forums/topic:28113 – Qsario

+0

ध्यान देने योग्य मूल्य, मैंने अभी परीक्षण किया मेरे हेरोकू ऐप में 8.5 एमबी फ़ाइल अपलोड करना, जिसमें 3 मिनट और 15 सेकंड लग गए (हाँ, मेरे पास डीएसएल है)। मेरे पास 'वेब: गनिकॉर्न -टी 60-के "इवेंटलेट" -w 3 myapp.wsgi: एप्लिकेशन' मेरे 'Procfile' में है। दूसरे शब्दों में, मैंने अपना टाइमआउट 60 सेकंड तक बढ़ा दिया है, और मेरा ऐप अपलोड को 3 मिनट से अधिक समय लेने की अनुमति देगा। मुझे इसके कारण का यकीन नहीं है, लेकिन मेरे डिनो के साथ समवर्ती कनेक्शन की अनुमति देने के लिए कुछ करना है। – orokusaki

उत्तर

4

अद्यतन:

ओपी यहाँ। मुझे अभी भी बिल्कुल यकीन नहीं है कि मुझे यह विशेष 413 त्रुटि क्यों मिल रही थी, लेकिन मैं s3_swf_upload मणि का उपयोग करके काम करने वाले समाधान के साथ आने में सक्षम था। कार्यान्वयन में फ़्लैश शामिल है, जो आदर्श से कम है, लेकिन यह एकमात्र समाधान था (मैंने कोशिश की 3 या 4 में से) कि मैं काम कर सकता हूं।

जैसा कि नील ने बताया (धन्यवाद नील!), मुझे जो त्रुटि मिल रही थी वह है "एच 12 - अनुरोध टाइमआउट"। और बार-बार परीक्षणों के बाद मैंने इस त्रुटि में भाग लिया।समस्या तब होती है जब आप अपने कंट्रोलर (वेब ​​डिनो का उपयोग करके) से हीशुोक सर्वर पर बड़ी फ़ाइलों को अपलोड करने का प्रयास करते हैं, क्योंकि सर्वर के पोस्ट अनुरोध का जवाब देने में बहुत लंबा समय लगता है।

उचित तरीका फ़ाइल को सीधे उसके 3 से सीधे बिना एस 3 पर भेजने के लिए है।

  1. S3 के लिए एक सीधा अपलोड फ़ॉर्म आपूर्ति करने के लिए s3_swf_upload मणि का उपयोग करें:

    यहाँ मेरी दृष्टिकोण का एक उच्च स्तरीय अवलोकन है।

  2. यह पता लगाएं कि फ़ाइल कब की जाती है जब मणि में प्रदान किए गए जावास्क्रिप्ट कॉलबैक फ़ंक्शन के साथ अपलोड किया जाता है।
  3. जावास्क्रिप्ट का उपयोग करके, रेल को अपने सर्वर को यह जानने के लिए एक पोस्ट संदेश भेजें कि फाइल अपलोड हो रही है।
  4. जावास्क्रिप्ट पोस्ट का जवाब देने वाला नियंत्रक दो चीजें करता है: (ए) वीडियो ऑब्जेक्ट में एक s3_key विशेषता निर्दिष्ट करता है (फ़ॉर्म में परम के रूप में कार्य किया जाता है)। (बी) delayed_job मणि का उपयोग कर पृष्ठभूमि कार्य शुरू करता है।
  5. पृष्ठभूमि कार्य फ़ाइल को s3 से पुनर्प्राप्त करता है। मैंने इसे पूरा करने के लिए aws-sdk मणि का उपयोग किया, क्योंकि यह पहले ही s3_swf_upload में शामिल था। ध्यान दें कि यह aws-s3 मणि से अलग है (वास्तव में वे एक दूसरे के साथ संघर्ष करते हैं)।
  6. फ़ाइल को एस 3 से पुनर्प्राप्त करने के बाद, मैंने इसे vimeo मणि का उपयोग vimeo (अभी भी पृष्ठभूमि में) अपलोड करने के लिए किया था।

कार्यान्वयन काम करता है इसके बाद के संस्करण, लेकिन यह सही नहीं है। 500 एमबी आकार के करीब की फ़ाइलों के लिए, आप अभी भी अपने कार्यकर्ता dynos में R14 त्रुटियों में भाग लेंगे। ऐसा इसलिए होता है क्योंकि उसकेोकू केवल 512 एमबी मेमोरी प्रति डिनो आवंटित करते हैं, इसलिए आप पूरी फाइल को स्मृति में एक बार में लोड नहीं कर सकते हैं। इस समस्या के आसपास का तरीका अंतिम चरण में कुछ प्रकार के खंडन को कार्यान्वित करना है, जहां आप फ़ाइल को एस 3 से पुनर्प्राप्त करते हैं और इसे टुकड़े से vimeo टुकड़े पर अपलोड करते हैं। मैं अभी भी इस हिस्से पर काम कर रहा हूं, और मुझे आपके सुझावों को सुनना अच्छा लगेगा।

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

+0

"कोयरवेव" को "धुंध" और "कैरियरवेव डायरेक्ट" के साथ देखें – Narfanator

+0

यह सहायक है, धन्यवाद! –

2

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

इसलिए, आपको उपयोगकर्ताओं को S3/Vimeo/whereever पर सीधे अपलोड करने की आवश्यकता है और फिर इन अपलोड की गई संपत्तियों पर अपना एप्लिकेशन डेटा कनेक्ट करें।

यदि आप रूबी का उपयोग कर रहे हैं, तो वाहक-लहर प्रत्यक्ष मणि यह देखने के लायक हो सकता है कि यह कैसे किया जाता है। ऐसा लगता है कि वहां तीसरी पार्टी सेवाएं हैं जो आपको कुछ कोड के माध्यम से ऐसा करने की अनुमति देती हैं, जिसे आप पृष्ठ में छोड़ सकते हैं, लेकिन ये संलग्न लागत के साथ आते हैं।

+0

धन्यवाद नील, ऊपर वर्णित समस्या एक टाइमआउट नहीं लगती है। लॉग में कोई "एच 12 - अनुरोध समय समाप्ति" नहीं है।मैं समझता हूं कि बड़ी फाइल अपलोड के साथ समय-समय पर बड़ा जोखिम है, इसलिए मैं सीधे अपलोड देखूंगा। शायद यह ऊपर की समस्या को भी हल करेगा। – stephenalexbrowne

+0

यह चाहिए। मुझे लगता है कि आप अब तक एक सभ्य कनेक्शन पर परीक्षण कर रहे हैं। –

+0

यह तभी होता है जब कनेक्शन 30 सेकंड के लिए निष्क्रिय हो जाता है, यह समय समाप्त हो जाता है। –

2

मुझे लगता है कि यहां सबसे अच्छा विकल्प वास्तव में S3 पर अपलोड करना है। उपयोगकर्ताओं को अपने सर्वर (या इस मामले में हरोकू) में फ़ाइलों को अपलोड करने की अनुमति देने से यह बहुत सस्ता और अधिक सुरक्षित है। यह एक बहुत ही सिद्ध पैटर्न है जो कई वीडियो होस्टिंग प्लेटफॉर्म द्वारा उपयोग किया जाता है (मुझे पता है कि वज़ा यह करते हैं)।

jQuery अपलोड प्लगइन बाहर की जाँच करें, जो S3 के लिए सीधी अपलोड की अनुमति देता है: https://github.com/blueimp/jQuery-File-Upload

इसके अलावा इस विषय के आसपास Railscasts की जाँच: # 381 और # 383।