मैं JSZip का उपयोग करके क्लाइंट साइड से एक ज़िप फ़ाइल की बाइट स्ट्रिंग भेज रहा हूं और इसे सर्वर साइड पर वापस ज़िप में बदलने की आवश्यकता है। मैंने जिस कोड की कोशिश की है वह काम नहीं कर रहा है।

b = bytearray()
b.extend(map(ord, request.POST.get("zipFile")))

zipPath = 'uploadFile' + str(uuid.uuid4()) + '.zip'
myzip = zipfile.ZipFile(zipPath, 'w') 
with  myzip:
    myzip.write(b)

यह त्रुटि देता है:

stat: path too long for Windows 

मैं अपनी बाइट स्ट्रिंग को ज़िप फ़ाइल के रूप में कैसे सहेजूँ?

2
Tahreem Iqbal 10 अक्टूबर 2016, 14:51
क्या आप सुनिश्चित हैं कि request.POST.get("zipFile") से लौटाया गया डेटा एक ज़िप फ़ाइल है? विशेष रूप से, पहले 4 बाइट्स b'PK\x03\x04' हैं? साथ ही, आपको यह उल्लेख करना चाहिए कि आप Python 2 या Python 3 का उपयोग कर रहे हैं (अधिमानतः उपयुक्त टैग का उपयोग करके)।
 – 
PM 2Ring
10 अक्टूबर 2016, 16:11
मैंने अपलोड की गई फ़ाइल को ज़िप में बदलने और बाइट स्ट्रिंग प्राप्त करने के लिए JSZip से zip.generateAsync({type:"base64"}) विधि का उपयोग किया। इसे ठीक करने के लिए पुस्तकालय पर भरोसा करना होगा, है ना? और मैं पायथन 3 का उपयोग कर रहा हूं
 – 
Tahreem Iqbal
10 अक्टूबर 2016, 16:19
1
आप शायद binascii.a2b_base64 का उपयोग करके इसे डीकोड करना चाहेंगे।
 – 
Yann Vernier
10 अक्टूबर 2016, 16:28

3 जवाब

JSZip ने पहले ही एक ज़िप संग्रह बना लिया है। ज़िप फ़ाइल मॉड्यूल ज़िप फ़ाइल सामग्री तक पहुँचने के लिए है, लेकिन आपको इसे संग्रहीत करने के लिए इसे पार्स करने की आवश्यकता नहीं है। इसके अलावा, बायटेरे को सीधे स्ट्रिंग्स से बनाया जा सकता है, इसलिए नक्शा (ऑर्ड,) ज़रूरत से ज़्यादा है, और लिखना स्ट्रिंग्स को भी संभाल सकता है (बाइटियरे संख्यात्मक बाइनरी डेटा को संभालने या एक परिवर्तनीय स्ट्रिंग जैसी वस्तु बनाने के लिए है)। तो थोड़ा सरलीकृत संस्करण हो सकता है:

zipContents = request.POST.get("zipFile")
zipPath = 'uploadFile' + str(uuid.uuid4()) + '.zip'
with open(zipPath, 'wb') as zipFile:
    zipFile.write(zipContents)
3
Yann Vernier 10 अक्टूबर 2016, 15:40
एक मामूली संशोधन के साथ (`zipFile.write(bytes(zipContents, 'UTF-8')) `) इसने ज़िप फ़ाइल बनाई लेकिन इसे खोलने से त्रुटि मिलती है कि फ़ाइल क्षतिग्रस्त है।
 – 
Tahreem Iqbal
10 अक्टूबर 2016, 15:48
मैं हार मानता हूं। मैं इसके बजाय क्लाइंट साइड से फाइल को कंप्रेस कर दूंगा। धन्यवाद।
 – 
Tahreem Iqbal
10 अक्टूबर 2016, 15:48
2
क्या? मैंने सोचा था कि आप पहले ही कर चुके हैं, आप JSZip का उल्लेख क्यों करेंगे? साथ ही, ज़िप फ़ाइलें टेक्स्ट नहीं हैं और उन्हें UTF-8 जैसे वर्ण एन्कोडिंग का उपयोग नहीं करना चाहिए। वे बाइनरी डेटा हैं। आपकी request वस्तु उसके कारण महत्वपूर्ण हो सकती है; इसे बेस 64, urlscape या इसी तरह के डेटा को डीकोड करना होगा।
 – 
Yann Vernier
10 अक्टूबर 2016, 15:52

ZipFile.write(filename, [arcname[, compress_type]]) एक स्थानीय का नाम लेता है ज़िप फ़ाइल में जोड़ने के लिए फ़ाइल। bytearray या bytes ऑब्जेक्ट से डेटा लिखने के लिए आपको ZipFile.writestr(zinfo_or_arcname, bytes[, compress_type]) विधि:

with zipfile.ZipFile(zipPath, 'w'):
    zipFile.write('name_of_file_in_archive', zipContents)

ध्यान दें: अगर request.POST.get("zipFile") पहले से ही bytes (या str python2 में है) तो आपको इसे आर्काइव में लिखने से पहले इसे bytearray में बदलने की जरूरत नहीं है।

8
mata 10 अक्टूबर 2016, 15:52