2012-09-27 16 views
6

विफल रहता है मैं आरईएसटी एपीआई और एचटीएमएल 5 फ़ाइल स्लाइसिंग का उपयोग करके अमेज़ॅन एस 3 में एक बड़ी फाइल (1.5 जीबी) अपलोड करने की कोशिश कर रहा हूं। यहाँ कैसे अपलोड कोड (पठनीयता के लिए नीचे छीन कोड) की तरह लग रहा है:अमेज़ॅन एस 3 कॉर्स पुट

File.prototype.slice = File.prototype.webkitSlice || File.prototype.mozSlice || File.prototype.slice; 

var length = u.settings.chunk_size; // 6MB 
var start = chunk * length; 
var end = Math.min(start + length, u.file.size); 

var xhr = new XMLHttpRequest(); 
var path = "/" + u.settings.key; 

path += "?partNumber=" + chunk + "&uploadId=" + u.upload_id; 

var method = "PUT"; 
var authorization = "AWS " + u.settings.access_key + ":" + signature; 
var blob = u.file.slice(start, end); 

xhr.upload.addEventListener("progress", progress_handler, true); 
xhr.addEventListener("readystatechange", handler, true); 
xhr.addEventListener("error", error_handler, true); 
xhr.addEventListener("timeout", error_handler, true); 

xhr.open(method, u.settings.host + path, true); 

xhr.setRequestHeader("x-amz-date", date); 
xhr.setRequestHeader("Authorization", authorization); 
xhr.setRequestHeader("Content-Type", u.settings.content_type); 
xhr.setRequestHeader("Content-Disposition", "attachment; filename=" + u.file.name); 

xhr.send(blob); 

chunk_size 6MB है। एक खंड के बाद अपलोड करने के बाद, अगला अगला अनुसरण करता है, और इसी तरह। लेकिन कभी-कभी (हर 80 भाग या तो), PUT अनुरोध e.type == "error", e.target.status == 0 (जो मुझे आश्चर्य करता है) के साथ विफल रहता है, और e.target.responseText == ""। एक खंड विफल होने के बाद, कोड इसे अपलोड करने का प्रयास करता है, और एक ही त्रुटि प्राप्त करता है। जब मैं पृष्ठ को रीफ्रेश करता हूं और अपलोड जारी रखता हूं (वही हिस्सा!), यह एक आकर्षण की तरह काम करता है (80 टुकड़ों के लिए या तो, जब यह फिर से अटक जाता है)। यहाँ कैसे अनुरोध क्रोम देव उपकरणों में दिखाई देता है:

enter image description here enter image description here enter image description here

कोई भी विचार यह क्यों होना चाहिए, या कैसे कुछ इस तरह डिबग करने के लिए?

संपादित करें:

enter image description here

उत्तर

4

मैं अंत में पैकेट सूँघने से मुद्दा पाया:

  1. PUT के लिए अनुरोध करता है कि मिल एक 4xx (अन्य गैर 2xx प्रतिक्रिया के लिए परीक्षण नहीं किया है), XHR अनुरोध रिटर्न के रूप में: वहाँ दो मुद्दे हैं निरस्त (स्थिति = 0); अभी भी नहीं पाया है कि के लिए एक स्पष्टीकरण, Why does a PUT 403 show up as Aborted? की जाँच

  2. अमेज़न S3 एक 403 कि RequestTimeTooSkewed कहा के साथ जवाब दिया, क्योंकि मेरे हस्ताक्षर उत्पन्न कर रहे हैं जब अपलोड शुरू होता है, और 15 मिनट (समय समाप्ति कि RequestTimeTooSkewed त्रुटि से चलाता है के बाद), यह विफल रहता है, और हस्ताक्षर पुन: उत्पन्न किया जाना है। यही कारण है कि 403 त्रुटि कभी नहीं पहली समस्या के कारण, देव उपकरण कंसोल में या js कोड द्वारा देखा जाता है ..

हस्ताक्षर पुनः के बाद, सब कुछ एक आकर्षण की तरह काम करता है।

+0

हाँ, आदर्श रूप से आप अनुरोध पर हस्ताक्षर करेंगे जैसे कि आप उन्हें शुरुआत में एक बार में भेज रहे हैं। –

+0

@RyanParman हाँ, यह सही है, लेकिन मेरी लाइब्रेरी जेएस में है और मुझे हस्ताक्षर सर्वर-साइड उत्पन्न करने की आवश्यकता है, और मैं सर्वर को कम अनुरोध करता हूं। –

+0

आह, गोचा। हाँ, यह एक फर्क पड़ता है। :) –

2

आपको यह सत्यापित किया ब्राउज़र किसी भी 'विकल्प' अनुरोध कर रही है कि क्या: यहाँ OPTIONS प्रतिक्रिया है। यदि हाँ प्रतिक्रिया हेडर क्या है।

+0

मेरा संपादन देखें –