2017-05-24 11 views
8

मेरे पास क्लाइंट साइड कोड का एक टुकड़ा है जो Google ड्राइव से .docx फ़ाइल निर्यात करता है और डेटा को मेरे सर्वर पर भेजता है। यह बहुत सीधी आगे है, यह सिर्फ फाइल निर्यात करता है, इसे ब्लॉब में बनाता है, और ब्लॉब को पोस्ट एंडपॉइंट पर भेजता है।मैं POST अनुरोध से ज़िप फ़ाइल क्यों नहीं निकाल सकता?

<?php 
file_put_contents('tmp/document.docx', fopen('php://input', 'r')); 

जब मैं इस चलाने के लिए, फ़ाइल को अपने सर्वर पर बनाई गई है:

gapi.client.drive.files.export({ 
    fileId: file_id, 
    mimeType: "application/vnd.openxmlformats-officedocument.wordprocessingml.document" 
}).then(function (response) { 

    // the zip file data is now in response.body 
    var blob = new Blob([response.body], {type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"}); 

    // send the blob to the server to extract 
    var request = new XMLHttpRequest(); 
    request.open('POST', 'return-xml.php', true); 
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    request.onload = function() { 
     // the extracted data is in the request.responseText 
     // do something with it 
    }; 

    request.send(blob); 
}); 

यहाँ मेरी सर्वर पर इस फ़ाइल को सहेजने के लिए मेरे सर्वर साइड कोड तो मैं इसके साथ कर सकते हैं है। हालांकि, मेरा मानना ​​है कि यह दूषित है, क्योंकि जब मैं इसे अनज़िप करने के लिए (जैसा कि आप .docx साथ कर सकते हैं) की कोशिश, ऐसा होता है:

$ mv tmp/document.docx tmp/document.zip 
$ unzip tmp/document.zip 
Archive: document.zip 
error [document.zip]: missing 192760059 bytes in zipfile 
    (attempting to process anyway) 
error [document.zip]: start of central directory not found; 
    zipfile corrupt. 
    (please check that you have transferred or created the zipfile in the 
    appropriate BINARY mode and that you have compiled UnZip properly) 

क्यों नहीं यह यह एक उचित .zip फ़ाइल के रूप को पहचानना है?

+0

भावी पाठक के लिए नोट: मुझे अभी भी यह सुनिश्चित नहीं है कि यह कैसे करें।मुझे लगता है कि मैं एक ज़िप-फ़ाइल-आकार वाले पेग को एक्सेस-टोकन-आकार वाले छेद में फिट करने के लिए बहुत मेहनत कर रहा था। इसलिए, मैंने बैकएंड पर गैसी निर्यात कॉल करने के लिए एप्लिकेशन को पुनर्गठित किया और वहां निकाले गए डेटा के साथ सामान किया। –

उत्तर

3

मुझे लगता है कि यह उस "एप्लिकेशन/एक्स-www-form-urlencoded" पर निर्भर हो सकता है। तो जब आप php: // इनपुट के साथ अनुरोध डेटा पढ़ते हैं तो यह कुछ http प्रॉपर्टी भी बचाता है, इसलिए .zip यह दूषित हो जाता है। .zip फ़ाइल खोलने का प्रयास करें और देखें कि अंदर क्या है। ठीक करने के लिए, अगर समस्या है जो मैंने घटक-प्रकार को एप्लिकेशन/ऑक्टेट-स्ट्रीम में बदलने की कोशिश करने से पहले कहा था।

+0

आप अंदर क्या है यह देखने के लिए ज़िप फ़ाइल खोलने की सलाह देते हैं? मैं इसे अनजिप नहीं कर सकता ... –

+1

मैंने इसे अनजिप करने के बारे में बात नहीं की, इसे हेक्सडम्पर (या एक सामान्य संपादक के साथ देखने की कोशिश करें, बस कुछ http पोस्ट डेटा है या नहीं) –

+0

यह प्रकट नहीं होता है कि 'php: // input' में कोई प्रतिक्रिया जानकारी है। सामग्री प्रकार को 'एप्लिकेशन/ऑक्टेट-स्ट्रीम' में बदलने से कुछ भी नहीं हुआ :( –

5

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

जब आप ऐसा करते हैं, तो आप देखेंगे कि स्थानांतरण के दौरान आपका ज़िप बदल गया है या नहीं। इस जानकारी के साथ आप यह खोजना जारी रख सकते हैं कि यह क्यों बदला जाता है। ईजी। जब आप zipfile ascii 10 को "13" या "10 13" में परिवर्तित कर देते हैं तो यह फ़ाइल स्थानांतरण

पर एक समस्या समाप्त करने वाली समस्या हो सकती है क्योंकि जब आप fopen(..., 'r') के साथ php में फ़ाइलें खोलते हैं तो यह हो सकता है कि \ n संकेत हैं जब आप विंडोज़ का उपयोग कर रहे हों तो आप बदल सकते हैं, आप fopen(..., 'rb') का उपयोग करने की कोशिश कर सकते हैं जो लाइन अंतराल को स्थानांतरित किए बिना फ़ाइल पढ़ने के लिए बिनरी लागू करता है।

@see: https://stackoverflow.com/a/7652022/2377961

@see php दस्तावेज़ीकरण fopen

2

मैं पोस्ट करने से पहले एक पाठ धारा में बाइनरी डेटा एन्कोड करने के बेस 64 उपयोग करने का सुझाव है, मैं इस से पहले किया है और यह अच्छी तरह से काम करता है, का उपयोग करेगा बाइनरी डेटा के लिए यूआरएल एन्कोडिंग काम नहीं करेगा। फिर आपके सर्वर पर आप भंडारण से पहले बाइनरी में वापस कनवर्ट करने के लिए 64 डीकोड का आधार बनाते हैं।

एक बार इसकी बेस 64 में आप इसे टेक्स्ट के रूप में पोस्ट कर सकते हैं।

1

ठीक है, मेरे लिए यह एक ज़िप फ़ाइल नहीं है। Drive API पर देखकर आप देख सकते हैं कि application/vnd.openxmlformats-officedocument.wordprocessingml.document ज़िप नहीं है, जैसे application/zip है। मुझे लगता है कि फ़ाइल को डॉक्स के रूप में संभालना चाहिए, मुझे लगता है। क्या आपने कोशिश की है?

+0

हाँ, जब मैं फ़ाइल को .docx के रूप में निर्यात करता हूं स्थानीय रूप से मैं बस एक ज़िप फ़ाइल की तरह निकाल सकता हूं। –

+0

ठीक है, मुझे नहीं पता था कि डॉक्स को अनजिप किया जा सकता है !! धन्यवाद! – Saleiro

0

आप "Content-type", "application/x-www-form-urlencoded" का उपयोग कर बीएलओबी पर लागू कोई यूआरएल एन्कोडिंग के साथ एक बीएलओबी (बाइनरी फाइल) भेज रहे हैं ... इसलिए, PHP प्राप्त करने वाली फ़ाइल ज़िप फ़ाइल नहीं है, यह दूषित है। "सामग्री-प्रकार" बदलें या बीएलओबी में यूआरएल एन्कॉन्डिंग लागू करें। आप MDN - Sending forms through JavaScript पर एक बेहतर विचार प्राप्त कर सकते हैं। इन प्रश्नों को भी मदद करनी चाहिए: question 1, question 2। आपको फ़ाइल को ठीक से भेजना होगा।

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