2017-05-24 14 views
8

Tôi có một đoạn mã phía máy khách xuất tệp .docx từ Google Drive và gửi dữ liệu đến máy chủ của tôi. Nó khá thẳng về phía trước, nó chỉ xuất khẩu các tập tin, làm cho nó thành một blob, và gửi blob đến một điểm cuối POST.Tại sao tôi không thể trích xuất tệp zip từ yêu cầu POST?

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); 
}); 

Đây là mã phía máy chủ của tôi để lưu file này vào máy chủ của tôi để tôi có thể làm việc với nó:

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

Khi tôi chạy này, các tập tin được tạo ra trên máy chủ của tôi. Tuy nhiên, tôi tin rằng nó bị hỏng, bởi vì khi tôi cố gắng để giải nén nó (như bạn có thể làm với .docx), điều này xảy ra:

$ 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) 

Tại sao phải không thừa nhận nó như là một tập tin .zip thích hợp?

+0

Lưu ý cho người đọc trong tương lai: Tôi vẫn không chắc chắn cách thực hiện việc này.Tôi nghĩ rằng tôi đã cố gắng hết sức để phù hợp với một hình zip-file hình thành một lỗ hình dạng truy cập-token. Vì vậy, tôi đã tái cơ cấu ứng dụng để thực hiện các cuộc gọi xuất khẩu gapi trên phần phụ trợ và thực hiện các công cụ với dữ liệu được trích xuất ở đó. –

Trả lời

3

Tôi nghĩ rằng điều đó có thể phụ thuộc vào "ứng dụng/x-www-form-urlencoded" đó. Vì vậy, khi bạn đọc dữ liệu yêu cầu với đầu vào php: // nó cũng lưu một số thuộc tính http, vì vậy tệp .zip bị hỏng. Hãy thử mở tệp .zip và xem nội dung bên trong. Để khắc phục, nếu sự cố là những gì tôi đã nói trước khi thử thay đổi loại Contenent thành application/octet-stream.

+0

Bạn khuyên bạn nên mở tệp zip để xem nội dung bên trong là gì? Tôi không thể giải nén nó ... –

+1

Tôi không nói về giải nén nó, hãy thử nhìn vào nó với một hexdumper (hoặc một trình soạn thảo bình thường, chỉ ti xem nếu có một số dữ liệu bài http) –

+0

Nó không xuất hiện 'php: // input' chứa bất kỳ thông tin phản hồi nào. Thay đổi kiểu nội dung thành 'application/octet-stream' không làm bất cứ điều gì: ( –

5

Trước tiên bạn nên tải xuống mã zip gốc và so sánh nội dung của nó với những gì yhou nhận được trên máy chủ của bạn, bạn có thể thực hiện điều này e.gg. với lệnh "diff" của totalcommander hoặc dòng.

Khi bạn thực hiện việc này, bạn sẽ thấy mã zip của mình có thay đổi trong khi chuyển hay không. Với thông tin này, bạn có thể tiếp tục tìm kiếm TẠI SAO nó được thay đổi. Ví dụ: khi bạn zipfile ascii 10 được chuyển thành "13" hoặc "10 13", đó có thể là sự cố kết thúc dòng khi chuyển tệp

Vì khi bạn mở tệp bằng php với fopen(..., 'r'), có thể xảy ra, đó là dấu hiệu chuyển đổi khi bạn đang sử dụng các cửa sổ, bạn có thể thử sử dụng fopen(..., 'rb') thực thi BINARY đọc một tệp mà không cần chuyển kết thúc dòng.

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

tài liệu @see php fopen

2

tôi sẽ đề nghị sử dụng để mã hóa base64 dữ liệu nhị phân vào một dòng văn bản trước khi đăng, tôi đã làm điều này trước và nó hoạt động tốt, sử dụng mã hóa url cho dữ liệu nhị phân sẽ không hoạt động. Sau đó, trên máy chủ của bạn, bạn cơ sở 64 giải mã để chuyển đổi trở lại nhị phân trước khi lưu trữ.

Khi đã ở trong base64, bạn có thể đăng dưới dạng văn bản.

1

Vâng, với tôi đó không phải là tệp ZIP. Nhìn vào Drive API bạn có thể thấy rằng application/vnd.openxmlformats-officedocument.wordprocessingml.document không được nén, như application/zip. Bạn nên xử lý các tập tin như một DOCX, tôi nghĩ. Bạn đã thử chưa

+0

Vâng, khi tôi xuất tệp dưới dạng .docx tại địa phương tôi có thể giải nén giống như một tập tin zip –

+0

Ok, tôi không biết rằng docx có thể được giải nén !! – Saleiro

0

Bạn đang gửi BLOB (tệp nhị phân) sử dụng "Content-type", "application/x-www-form-urlencoded" không có mã hóa url được áp dụng trên BLOB ... do đó, tệp mà PHP nhận không phải là tệp ZIP, tệp bị hỏng. Thay đổi "Loại nội dung" hoặc áp dụng url mã hóa cho BLOB. Bạn có thể có ý tưởng tốt hơn khi xem MDN - Sending forms through JavaScript. Câu hỏi này cũng sẽ hữu ích: question 1, question 2. Bạn phải gửi tệp đúng cách.

Các vấn đề liên quan