Warum kann ich keine ZIP-Datei aus einer POST-Anfrage extrahieren?

8

Ich habe einen Clientcode, der eine DOCX-Datei aus Google Drive exportiert und die Daten an meinen Server sendet. Es ist ziemlich einfach, es exportiert nur die Datei, macht es zu einem Blob und sendet das Blob an einen POST-Endpunkt.

%Vor%

Hier ist mein serverseitiger Code, um diese Datei auf meinem Server zu speichern, damit ich damit umgehen kann:

%Vor%

Wenn ich das ausführe, wird die Datei auf meinem Server erstellt. Allerdings glaube ich, dass es beschädigt ist, denn wenn ich versuche, es zu entpacken (wie Sie mit .docx tun können), geschieht dies:

%Vor%

Warum erkennt es das nicht als richtige .zip-Datei?

    
Lincoln Bergeson 24.05.2017, 21:24
quelle

5 Antworten

5

Sie sollten zuerst die Original-Zip herunterladen, und vergleichen Sie ihren Inhalt mit dem, was Sie auf Ihrem Server erhalten, können Sie dies e.gg tun. mit totalcommander oder Zeile "diff" -Befehl.

Wenn Sie dies tun, werden Sie sehen, ob sich Ihre Postleitzahl während der Übertragung ändert. Mit diesen Informationen können Sie weiter suchen, WARUM es geändert wird. Z.B. wenn in dir zipfile ascii 10 in "13" oder "10 13" umgewandelt wird, könnte es ein Zeilenende-Problem bei der Dateiübertragung sein

Da, wenn Sie Dateien in PHP mit fopen(..., 'r') öffnen, kann es passieren, dass \ n Zeichen transformiert werden, wenn Sie Windows verwenden. Sie könnten fopen(..., 'rb') verwenden, was BINARY das Lesen einer Datei erzwingt, ohne Zeilenenden zu übertragen.

@see: Ссылка

@see php Dokumentation fopen

    
Radon8472 11.07.2017 12:58
quelle
3

Ich denke, es hängt davon ab, "application / x-www-form-urlencoded". Also, wenn Sie die Anfrage Daten mit php lesen: // Eingabe speichert es auch einige http-Eigenschaft, so dass die. Zip es ist beschädigt. Versuchen Sie, die .zip-Datei zu öffnen, und sehen Sie sich an, was sich darin befindet. Um das Problem zu beheben, versuche ich den Contentent-Typ in application / octet-stream zu ändern.

    
Riccardo Bonafede 24.05.2017 22:17
quelle
2

Ich würde vorschlagen, base64 zu benutzen, um die binären Daten in einen Textstrom vor dem Posten zu kodieren, ich habe dies vorher getan und es funktioniert gut, die Verwendung von URL-Kodierung für binäre Daten wird nicht funktionieren. Dann basiere auf deinem Server 64 dekodieren, um vor dem Speichern zurück in Binär zu konvertieren.

Sobald es in base64 ist, können Sie es als Text veröffentlichen.

    
SPlatten 12.07.2017 12:45
quelle
1

Nun, für mich ist das keine ZIP-Datei. In der Google Drive-API sehen Sie, dass application/vnd.openxmlformats-officedocument.wordprocessingml.document nicht gezippt wird, wie application/zip ist. Sie sollten die Datei als DOCX behandeln, denke ich. Hast du das probiert?

    
Saleiro 12.07.2017 16:21
quelle
0

Sie senden eine BLOB (Binärdatei) mit "Content-type", "application/x-www-form-urlencoded" , ohne dass eine URL-Kodierung auf das BLOB angewendet wurde. Die von PHP empfangene Datei ist also keine ZIP-Datei, sondern eine beschädigte Datei. Ändern Sie den "Content-type" oder wenden Sie url enconding auf BLOB an. Sie können eine bessere Idee erhalten, wenn Sie MDN - Formulare über JavaScript senden aufrufen. Diese Fragen sollten auch helfen: Frage 1 , < a href="https://stackoverflow.com/questions/8659808/how-does-http-file-upload-work"> Frage 2 . Sie müssen die Datei ordnungsgemäß senden.

    
Saleiro 12.07.2017 19:35
quelle