2010-09-18 17 views
8

मैं एक वेबपैप पर काम कर रहा हूं जो कई अत्याधुनिक वेबकिट सुविधाओं का उपयोग करता है। यह अनिवार्य रूप से ऐसा करता है: FileReader के साथ एक स्थानीय फ़ाइल को पढ़ता है, जावास्क्रिप्ट अनजिप लाइब्रेरी का उपयोग करके प्रत्येक फ़ाइल को एक स्ट्रिंग में अनजिप करता है, और XMLHttpRequest का उपयोग करके प्रत्येक फ़ाइल पोस्ट करता है। यह टेक्स्ट फ़ाइलों के लिए बहुत अच्छा काम करता है, लेकिन दुर्भाग्यवश यह बाइनरी फाइलों को दूषित करता है (इस मामले में, छवियों में)। फ़ायरफ़ॉक्स में sendAsBinary विधि है जो इस समस्या को हल करती है, लेकिन यह गैर-मानक है, और बिंदु पर अधिक, यह वेबकिट/क्रोम पर काम नहीं करता है जिसे हम अन्य सुविधाओं के लिए निर्भर करते हैं।एक्सएचआर (फ़ायरफ़ॉक्स के प्रेषण एएसबीनरी के बराबर) का उपयोग कर वेबकिट/क्रोम में एक बाइनरी स्ट्रिंग अपलोड करना

समाधानों की एक टन कर रहे हैं, और अब तक उनमें से कोई भी मेरे लिए काम: एक लंबी स्ट्रिंग (like this) में बहुत आगे है

  • हेडर, सीमाओं के साथ एक फ़ाइल अपलोड अनुरोध मजाक, और।
  • XHR वस्तु (as such)
  • BlobBuilder का उपयोग करना, बिल्डर के लिए स्ट्रिंग जोड़कर, और getBlob के प्रयोग पर हेडर के एक झुंड की स्थापना
  • (इस बारे में क्रोम मुद्दा सूत्र में as recommended) एक ब्लॉब अपलोड करने के लिए प्राप्त करने के लिए

जो मैं खोज रहा हूं, सबसे अधिक, एक आगे-अनुकूल समाधान है। धन्यवाद!

उत्तर

6

मुझे एक ही समस्या थी।

यह एक मेरे लिए काम किया:

XMLHttpRequest.prototype.sendAsBinary = function(datastr) { 
    function byteValue(x) { 
     return x.charCodeAt(0) & 0xff; 
    } 
    var ords = Array.prototype.map.call(datastr, byteValue); 
    var ui8a = new Uint8Array(ords); 
    this.send(ui8a.buffer); 
} 

यहाँ की जांच: http://javascript0.org/wiki/Portable_sendAsBinary

1

आप इसे बेस 64 के साथ एन्कोड कर सकते हैं और इसे सर्वर पर डीकोड कर सकते हैं।

+0

आपके द्वारा अनुरोध सर्वर तक आसानी से पहुँचा है। मैं एक दस्तावेज़ (http://docs.couchdb.org/en/latest/api/document/attachments.html#put--db-docid-attname पर अनुलग्नक लगाने के लिए अपने डोमेन (सीओआरएस अनुमत) से एक कॉचडब तक पहुंचने का प्रयास करता हूं)। सेबेस्टियन चाल का प्रयास करेंगे। – Fluxine