2012-03-20 23 views
5

संलग्न नहीं करता है मैं AJAX अनुरोध के माध्यम से कुछ फ़ाइल अपलोड सुविधा लागू कर रहा हूं। मैं एक AJAX कॉल में एकाधिक फाइलें भेजने में सक्षम होना चाहता हूं, इसलिए मैंने फॉर्मडाटा का उपयोग करने का निर्णय लिया।क्रोम वेबकिटब्लोबबिल्डर डेटा

मैंने अपनी बाइनरी डेटा स्ट्रिंग को सीधे फॉर्मडाटा (और यह काम करता है) में जोड़ने की कोशिश की, लेकिन सामग्री-विस्थापन में फ़ाइल नाम विशेषता नहीं है: सामग्री-विस्थापन: फ़ॉर्म-डेटा; नाम = "file1"

W3C का कहना है कि मैं formdata करने के लिए एक ब्लॉब वस्तु संलग्न करने के लिए है कि विशेषता है करने के लिए (या FormData.append() 3 विशेषता के साथ इसे स्थापित करने के लिए सक्षम होने के लिए)

मैं की जरूरत है

function uploadAsBinary() { 
    var xhr = new XMLHttpRequest(); 
    var fd = new FormData(); 

    window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder; 
    var bb = new window.BlobBuilder(); 
    bb.append("this is my binary content"); 
    var blob = bb.getBlob("text/plain"); 

    fd.append("file1", blob, "file1"); 

    xhr.open("POST", "/mb/0/", false); 
    xhr.send(fd); 
} 

यह फ़ायरफ़ॉक्स के साथ पूरी तरह ठीक काम करता है, लेकिन गूगल क्रोम (v16 और v17) के साथ, अनुरोध पेलोड उस में सामग्री के बिना एक formdata है:

------WebKitFormBoundaryVkgESMAGtmPMlPZ7 
Content-Disposition: form-data; name="file1"; filename="file1" 
Content-Type: text/plain 


------WebKitFormBoundaryVkgESMAGtmPMlPZ7-- 

निम्नलिखित कोड लिखा था मैंने एक ही परिणाम के रूप में एक ऐरेबफर के माध्यम से ब्लॉब भरने की कोशिश की है। मैं अब 2 दिनों के लिए वेब सर्फ कर रहा हूं, मुझे कोई जवाब नहीं मिला है। मुझे एंड्रॉइड पर एक खुली समस्या मिली है (http://code.google.com/p/android/issues/detail?id=22441) लेकिन यह काफी मृत लगता है।

क्या यह वास्तविक क्रोम मुद्दा है? क्या किसी के बारे में कोई सुराग है, या क्या मुझे क्रोमियम ट्रैकर पर कोई समस्या खुलनी चाहिए?

आपकी मदद के लिए Thx!

window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || 
       window.MozBlobBuilder || window.MSBlobBuilder; 
window.URL = window.URL || window.webkitURL; 

var bb = new BlobBuilder(); 
bb.append('body { color: red; }'); 
var blob = bb.getBlob('text/css'); 

var link = document.createElement('link'); 
link.rel = 'stylesheet'; 
link.href = window.URL.createObjectURL(blob); 

document.body.appendChild(link); 

ब्लॉब():

+2

एफवाईआई: मैंने क्रोमियम में कोई समस्या खोली है: https://code.google.com/p/chromium/issues/detail?id=119254 – Sebastien

+0

ऐसा लगता है कि यह अभी भी एक मुद्दा है, क्या कोई कामकाज है? – zfedoran

उत्तर

1

एक समाधान यहाँ की तलाश में किसी को भी के लिए, समस्या के रूप में explained here

BlobBuilder() ब्लॉब() के बजाय BlobBuilder() करने के लिए स्विच है:

window.URL = window.URL || window.webkitURL; 

var blob = new Blob(['body { color: red; }'], {type: 'text/css'}); 

var link = document.createElement('link'); 
link.rel = 'stylesheet'; 
link.href = window.URL.createObjectURL(blob); 
document.body.appendChild(link); 
+0

जैसा कि यहां बताया गया है https://code.google.com/p/chromium/issues/detail?id=119254#c7, BlobBuilder.getBlob() से नए ब्लॉब() में स्विच करने से Google Chrome पर इस समस्या का समाधान नहीं होता है। – mdittmer

+0

यह 2012 में वापस आया, लॉल। 3 साल बाद डाउनवोट करने की कोई ज़रूरत नहीं है .... – Corylulu

+0

मेरा मतलब यह व्यक्तिगत झटका नहीं था। मैं जवाबों को ऊपर उठाता हूं, जब मैं उन्हें सामना करता हूं और जवाब देता हूं तो मुझे लगता है कि जब मैं उन्हें सामना करता हूं तो मुझे अनुपयोगी लगता है। उस ने कहा, मुझे मिली समस्या के बावजूद, ब्लॉब पर स्विच करना काम में दिखाई देता है, हालांकि यह पोस्ट में वर्णित लक्षण से छुटकारा नहीं पाता है। – mdittmer

0

tl; डॉ क्रोम डेवलपमेंट टूल्स डेटा पेलोड पूर्वावलोकन से फ़ाइल डेटा क्लिप करने के लिए प्रतीत होता है। BlobBuilder से Blob पर स्विचिंग समस्या को हल करती है, लेकिन पेलोड का पूर्वावलोकन अभी भी फ़ाइल डेटा नहीं दिखाएगा; यह आपके द्वारा पोस्ट की गई (स्पष्ट रूप से खाली) जैसा ही दिखाई देगा।

आपके द्वारा वर्णित लक्षण भ्रामक है। मैं एक समान मुद्दे में भाग गया (यह पता चला कि यह Content-Type के गलत अधिभार के कारण हुआ था, लेकिन मैं digress)।

जब मेरी समस्या हल हो गई, मैंने देखा कि क्रोम डेवलपमेंट टूल्स सादे कुंजी/मूल्य डेटा दिखा रहा था, लेकिन डेटा डेटा नहीं दिखा रहा था। जब एक बड़ी फ़ाइल अपलोड करने, मैं कुछ इस तरह मिलेगा:

------WebKitFormBoundaryHyzYwSEV4FAfvi02 
Content-Disposition: form-data; name="uploadType" 

media 
------WebKitFormBoundaryHyzYwSEV4FAfvi02 
Content-Disposition: form-data; name="fileupload"; filename="blob" 
Content-Type: application/zip 


------WebKitFormBoundaryHyzYwSEV4FAfvi02-- 

सूचना "सादे" डेटा uploadType=media दिखाता है, जबकि फ़ाइल डेटा नहीं करता है। एकमात्र तरीका मैंने पुष्टि की कि फ़ाइल सही तरीके से अपलोड की गई है (अंत में सर्वर से सफलता कोड प्राप्त करने के अलावा) अनुरोध पूरा होने के बाद अनुरोध शीर्षलेख पर Chrome विकास उपकरण के नेटवर्क टैब को देखकर पूरा हो गया था। यह content-length: 1023235 दिखाया गया है, माना जाता है कि खाली फ़ाइल पेलोड से काफी बड़ा सुझाव है।