2011-12-04 21 views
9

मूल रूप से मैं बड़े XML फ़ाइलों के साथ काम करेंगे पर अपलोड करने से पहले। इन फ़ाइलों को एक सर्वर पर अपलोड करने की जरूरत है।फ़ाइल संपीड़न क्लाइंट साइड

मैं जानता हूँ कि यह जावास्क्रिप्ट के साथ फ़ाइलों को छूने के लिए, और न ही ग्राहक पक्ष पर HTTP संपीड़न लागू करने के लिए संभव नहीं है।

मेरा प्रश्न है कि किसी भी समाधान मौजूद है अगर (फ्लैश/कार्रवाई स्क्रिप्ट) है कि एक फ़ाइल को संपीड़ित करता है और एक जावास्क्रिप्ट एपीआई है?

  1. जावास्क्रिप्ट के साथ यह 50 MB एक्सएमएल फ़ाइल
  2. अपलोड अपलोड करने से पहले एक हड़पने और कंप्रेसर को भेजने के लिए कोशिश कर रहा है:

    परिदृश्य यह है।

  3. बजाय मूल एक के संकुचित फ़ाइल अपलोड करें।
+0

मुझे यह मिला लेकिन मैंने कभी इसका उपयोग नहीं किया (और यहां कोई फ़्लैश नहीं): http://jszip.stuartk.co.uk/ – AsTheWormTurns

+0

लिंक के लिए धन्यवाद, लेकिन मूल रूप से मुझे ऐसे समाधान की आवश्यकता होगी जो सभी प्रमुख ब्राउज़र में काम करे आईई 7 +, एफएफ, सफारी और क्रोम के रूप में। – feketegy

उत्तर

5

bytearray के फ्लैश की इनबिल्ट कार्यान्वयन के लिए एक विधि (ByteArray::deflate bytearray की सामग्रियों() हवा निकालना को Deflate एल्गोरिथ्म DEFLATE Compressed Data Format Specification version 1.3 है

वहाँ है, यह भी एक तरीका है जिसके ByteArray::compresszlib एल्गोरिथ्म

का उपयोग कर संपीड़ित करता है थोड़ा पर

होल्ड, मैं तुम्हें इस वर्ग का उपयोग करें और जावास्क्रिप्ट को यह बेनकाब करने के लिए कुछ नमूना कोड लिखेंगे।

संपादित

मैं http://www.filefactory.com/file/cf8a39c/n/demo5.zip

संपादित 2 पर फ़ाइल को अपलोड किया जो लोग फ़ाइलों को डाउनलोड नहीं कर सकता है के लिए: demo5.fla में

मेरे ActionScript कोड (demo5 का संकलन किया।swf)

import flash.external.ExternalInterface; 
import flash.net.FileReference; 
import flash.events.Event; 
import flash.utils.ByteArray; 

if(ExternalInterface.available) { 
    //flash.system.Security.allowDomain("localhost"); 
    ExternalInterface.addCallback("deflate", doDeflate); 
    ExternalInterface.addCallback("compress", doCompress); 
} 

var method:String="deflate"; 
var b:ByteArray; 
function doCompress(_data:String):void { 
    method="compress"; 
    exec(_data); 
} 

function doDeflate(_data:String):void { 
    method="deflate"; 
    exec(_data); 
} 

function exec(_data:String):void { 
    b=new ByteArray(); 
    b.writeUTFBytes(_data); 
    b.position=0; 
    if(method=="compress") { 
     b.compress(); 
    } else if(method=="deflate") { 
     b.deflate(); 
    } 
    executed(); 
} 

function executed():void { 
    if(ExternalInterface.available) { 
     b.position=0; 
     var str:String=b.readUTFBytes(b.bytesAvailable); 
     ExternalInterface.call("onExec", str); 
    } 
} 

swf एम्बेड करने के लिए मेरे एचटीएमएल कोड:

<button onclick="doDeflate()">Deflate</button> 
<button onclick="doCompress()">Compress</button> 
<div id="flashContent"> 
    <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="1" height="1" id="demo5" align="middle"> 
     <param name="movie" value="demo5.swf" /> 
     <param name="quality" value="high" /> 
     <param name="bgcolor" value="#ffffff" /> 
     <param name="play" value="true" /> 
     <param name="loop" value="true" /> 
     <param name="wmode" value="window" /> 
     <param name="scale" value="showall" /> 
     <param name="menu" value="true" /> 
     <param name="devicefont" value="false" /> 
     <param name="salign" value="" /> 
     <param name="allowScriptAccess" value="always" /> 

     <embed src="demo5.swf" quality="high" bgcolor="#869ca7" 
      width="1" height="1" name="demo5" align="middle" 
      play="true" loop="false" quality="high" allowScriptAccess="always" 
      type="application/x-shockwave-flash" 
      pluginspage="http://www.macromedia.com/go/getflashplayer"> 
     </embed> 
    </object> 
</div> 

और अंत में जावास्क्रिप्ट कोड:

function doDeflate() { 
    var data="fdg fhnkl,hgltrebdkjlgyu ia43uwriu67ri8m nirugklhvjsd fgvu"; 
    //DATA CONTAINS DATA TO BE DEFLATED 
    thisMovie("demo5").deflate(data); 
} 

function doCompress() { 
    var data="fdg fhnkl,hgltrebdkjlgyu ia43uwriu67ri8m nirugklhvjsd fgvu"; 
    //DATA CONTAINS DATA TO BE DEFLATED 
    thisMovie("demo5").compress(data); 
} 

function onExec(data) { 
    //DATA CONTAINS THE DEFLATED DATA 
    alert(data); 
} 

function thisMovie(movieName) { 
    if (navigator.appName.indexOf("Microsoft") != -1) { 
     return window[movieName]; 
    } else { 
     return document[movieName]; 
    } 
} 
+0

धन्यवाद, मैं इसके लिए इंतजार कर रहा हूं। :) इसके अलावा, फ्लैश की फाइल हैंडलिंग के साथ काम करना आसान है? मैं उस फ़ाइल को प्राप्त करने के लिए अनुमान लगा रहा हूं जिसकी आपको फ्लैश की फ़ाइल डायलॉग बॉक्स का उपयोग करने की आवश्यकता है, फिर इसे संपीड़ित करें और फिर इसे किसी भी तरह सर्वर पर भेजें ... – feketegy

+0

@feketegy, मैंने कुछ 32 मिनट पहले अपलोड जोड़ा है (डुनो क्यों इसके बाद मैंने जो टिप्पणी पोस्ट की, वह पोस्ट नहीं हुई)। वैसे भी, इसमें एचटीएमएल में बहुत आत्म-स्पष्टीकरण जावास्क्रिप्ट (टिप्पणियों के साथ) है, इसलिए यदि आपको कुछ भी नहीं मिलता है, तो पूछने में हिचकिचाहट न करें। हालांकि एक पकड़: आपको एचटीएमएल को http: // डोमेन पर चलाने या अपने फ़्लैश प्लेयर (आपकी पसंद) में अपवाद जोड़ना होगा –

+0

इसके लिए धन्यवाद, मैं भी <इनपुट प्रकार से एक फाइल पास कर सकता हूं = "फ़ाइल" />, फ्लैश के लिए? जावास्क्रिप्ट में मेरे पास केवल फ़ाइल के पथ तक पहुंच है और कुछ भी नहीं। तो एक बार फ़ाइल संपीड़ित हो जाने पर आप सुझाव देते हैं कि इसे सर्वर पर कैसे भेजा जाए? – feketegy

0

कुछ Huffman संपीड़न स्वतंत्र रूप से उपलब्ध है, उदाहरण के https://github.com/wilkerlucio/huffman_js के लिए की जावास्क्रिप्ट पुस्तकालय लेकिन मुझे लगता है कि अपने काम है क्योंकि जावास्क्रिप्ट के साथ असंभव है और यह ब्राउज़र या ग्राहक के स्मृति में विशाल डेटा लोड करने के संभव नहीं है HTML।

+0

हे, धन्यवाद, लेकिन जैसा कि मैंने पिछली टिप्पणी में उल्लेख किया है, मुझे एक ऐसे समाधान की आवश्यकता है जो आईई 7 + और अन्य प्रमुख ब्राउज़रों को काम करे। यह समाधान कुछ हद तक एक प्रयोगात्मक जावास्क्रिप्ट है, जो मुझे विश्वास नहीं है कि बड़ी एक्सएमएल फाइलों को 40 - 50 एमबी abob संभाल सकता है। – feketegy

+0

@feketegy: यह सिर्फ एक सुझाव है। आपके द्वारा इसे स्वयं ही किया जा सकता है। – Bytemain

+0

इसे देखें http://gildas-lormeau.github.io/zip.js/ –

1

यदि किसी भी कारण से आप सभी प्रमुख ब्राउज़रों के लिए जावास्क्रिप्ट में काम करने का कोई समाधान नहीं प्राप्त कर सकते हैं, तो मुझे यहां एएस 3 संपीड़न पुस्तकालय पता है: http://code.google.com/p/ascompress/

इसके अलावा, एक कम कूलर विकल्प, यदि आपके लक्षित उपयोगकर्ता कुछ तकनीकी समझदार हैं तो उन्हें xml की .zip फ़ाइल क्यों अपलोड नहीं की गई है? फिर सर्वर साइड पर आप अनज़िप और इस प्रक्रिया के रूप में की जरूरत है।

सर्वर पक्ष पर किसी भी तरह से आप अनजिप/डिकंप्रेस करना चाहते हैं, जो समाधान के लिए Google के लिए आसान होना चाहिए यदि आपके पास पहले से कोई दिमाग नहीं है। ।

+0

लिंक के लिए धन्यवाद। क्या इस समाधान में जावास्क्रिप्ट एपीआई है? मैं फ्लैश/एक्शनस्क्रिप्ट से परिचित नहीं हूं (मैं सिर्फ एक उपयोगकर्ता हूं)। साथ ही, मैं उपयोगकर्ताओं को पहले से ही एक्सएमएल फाइलों को ज़िप करने का जोखिम नहीं उठा सकता। दुर्भाग्यवश यह एक स्वचालित प्रक्रिया होनी चाहिए, हालांकि यह आदर्श होगा ... – feketegy

+0

आप इसे सभी एक्शनस्क्रिप्ट में संभाल सकते हैं, क्योंकि इसमें इसका स्वयं का फ़ाइल ब्राउज़र है। यदि आपको किसी भी कारण से जावास्क्रिप्ट से बात करने की आवश्यकता है, तो आप एएस 3 के बाहरी इंटरफेस का उपयोग कर सकते हैं। प्रणव के ऊपर एक अच्छा समाधान है। – ToddBFisher

1

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

1

यह अन्य stackoverflow post की समीक्षा करने पर विचार करें। दोनों उत्तरों को पेंटिंग संपीड़न वास्तविकता की एक अच्छी तस्वीर पेंट।

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

नियंत्रण स्थापित कर रहा है समय की बचत होती है, जो सामान्य रूप से सच है के रूप में उपयोगकर्ता को बेचा जाएगा। सर्वर के लिए, यह एक बैंडविड्थ और संपीड़न प्रसंस्करण सेवर होगा।

4

आप JSZip का उपयोग कर सकते हैं। इनपुट के लिए, यह String/ArrayBuffer/Uint8Array/Buffer, लेकिन नहींblob रों का समर्थन करता है, जो कि आप जावास्क्रिप्ट के साथ एक <input type="file"/> से क्या मिलेगा:

एक फ़ाइल वस्तु एक ब्लॉब के विशिष्ट प्रकार होता है, और किसी भी संदर्भ में इस्तेमाल किया जा सकता है कि एक ब्लॉब

(link)

तो तुम जैसे को ब्लॉब/फ़ाइल बदलने करना होगा कर सकते हैं पहले एक ऐरेबफर, उदा। FileReader.readAsArrayBuffer() का उपयोग कर। ध्यान दें कि यह फ़ंक्शन कॉलबैक उपयोग की मांग करते हुए असीमित रूप से काम करता है। FileReaderSync भी उपलब्ध है, फिर भी "यह इंटरफ़ेस केवल श्रमिकों में उपलब्ध है क्योंकि यह सिंक्रोनस I/O को सक्षम करता है जो संभावित रूप से अवरुद्ध हो सकता है", इसलिए मुझे इसका उपयोग करने में कोई अच्छा दिखाई नहीं देता है।

(संपादित करें। मुझे यकीन है कि नहीं कर रहा हूँ, लेकिन मेरा मानना ​​है कि आप अब blob-> ArrayBuffer रूपांतरण को छोड़ सकते हैं और केवल फ़ाइल वस्तु ज़िप।)

इस पूरे दृष्टिकोण विशेष रूप से उपयोगी है, तो php के निर्देश max_file_uploads था अपने वेबस्पेस मेजबान द्वारा एक छोटी संख्या के लिए सेट, अब है कि आपको बस करना होगा के लिए के बारे में upload_max_filesize

संदर्भ के लिए, एक कोड नमूना अंश में एक multiple फ़ाइल इनपुट के कई फ़ाइलें रखने के लिए (JQuery का प्रयोग करके) इस प्रकार है जमा करने से पहले एक ज़िप:

// onclick: 
var fileInput = $(':file'); 
var files = []; 
$.each(fileInput[0].files, function(i, file) { 
    files.push(file); 
}); 

var zip = new JSZip(); 
function addFileToZip(n) { 
    if(n >= files.length) { 
     zippingComplete(zip.generate({type:"blob", compression:"deflate"})); 
     return; 
    } 
    var file = files[n];      
    var arrayBuffer; 
    var fileReader = new FileReader(); 
    fileReader.onload = function() { 
     arrayBuffer = this.result; 
     zip.file(file.name, arrayBuffer); 
     addFileToZip(n + 1); 
    }; 
    fileReader.readAsArrayBuffer(file); 
} 
addFileToZip(0); 

function zippingComplete(zip) { 
    formData = new FormData(); 
    formData.append('fileZip', zip); 
    formData.append("param1", "blah"); 
    $.ajax({ 
     data: formData, 
     //... etc 

सर्वर-साइड-वार, आप $_FILES["fileZip"] तक पहुंच पाएंगे।

+0

आप संस्करण 3+ में ब्लॉब-> ऐरेबफर रूपांतरण को छोड़ सकते हैं। लेकिन पुराने संस्करण (मेरे मामले में 2.6) के लिए, आपका समाधान बहुत उपयोगी था –

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