1

クライアントのサードパーティのWebサイトから自分のWebサイトにファイル(.zip)を転送する必要があります。

GM-Snippet(他の試みをコメントアウト)

 GM_xmlhttpRequest({
    method: "GET",
    url: dlurl,
    timeout:0,
    onload: function(resp) {
    var conti=resp.responseText;

alert("goup");
GM_xmlhttpRequest({
    method: "POST",
    url: "http://absolut-fair.com/wbb_back/api.php?id=3",
    overrideMimeType: 'text/plain; charset=x-user-defined',
    data:"chk=1&data="+base64_encode(conti),
    headers: {
            "Content-Type": "application/x-www-form-urlencoded"
    },
    onload: function(resp) {
        var conti=resp.responseText;

        if(conti=="1") alert("upload erfolgreich");
        else alert(conti);
//....

PHP-スニペット

$name="test.txt";
uploadfile(base64_decode($_POST["data"]),detect_mime($name),$name);

問題

デコードしたファイルを開こうとすると、すべて破損します。問題は、バイナリデータの送信です。生のテキストの送信はうまくいきました!

//アップデート

正常で無効なzipファイルをダウンロードしたところ、無効なzipファイルが多くのスペースを処理して無駄なコードセグメントを埋めているようです。そのため、base64ではバイナリデータを完全にエンコード/デコードできないと感じました。誰か知識がありますか?

わかりやすくするために、ソースのスクリーンショットを添付しました。

有効なファイル:

有効なファイル

無効なもの:

無効なもの

4

1 に答える 1

1

ここで助けを得ることができなかったので、私はドイツのコミュニティ「gulli」の「Kugelfisch23」という名前の経験豊富なユーザーに助けを求め、彼にこのトピックを送りました。

問題を解決したので、Greasemonkeyを介してバイナリファイルを送信し、PHPで受信しようとしている他のユーザーに追加情報を提供したいと思います。

このような作業をしている場合は、最初にこのような小さな模範的なファイルを送信することをお勧めします。これには、すべてのバイナリ文字が含まれているためです。したがって、問題が発生している場所を確認でき、おそらく、エンコード/デコードが間違っている可能性があります。


1番目の問題:バイナリデータの受信

最初の例でわかるように、バイナリデータを送信するときはmimeタイプを上書きしましたが、受信するときは上書きしませんでしたしたがって、オブジェクトresponseTextにはUTF-8文字のみが含まれ、データが破損します。=>受信時にもmime-typeを上書きする必要があります。

GM_xmlhttpRequest({
    method: "GET",
    url: dlurl,
    timeout:0,
    overrideMimeType: 'text/plain; charset=x-user-defined',
    //...

2番目の問題:バイナリデータをbase64にエンコードする

バイナリデータをPOSTパラメータとして単純に送信することはできないため、送信可能にするためにデータをエンコードする必要があります。最初の試行では、このbase64_encode-関数を使用してデータをエンコードしました。後でわかったように、この関数はバイナリデータを送信するには不十分な変換しか提供せず、主にテキストのエンコードに使用する必要がありますか。 この関数(関数を参照します。base64Encode(str)と混同しないでくださいbase64ArrayBuffer)は、代わりにバイナリデータをエンコードできます。

3番目の問題:base64を送信する

PHP-Endpointが処理できない、または無効な文字に変換できない文字が多数含まれているため、base64でエンコードされた結果を投稿で送信するだけでは不十分です。encodeURIComponent送信する前にbase64-resultで使用してください。

4番目の問題:受信とデコード

着信データのデコードはかなり単純ですが、スニペットを提供します。

if(empty($_POST["data"])) die("no data sent");  
$name="test.zip";
$binary=base64_decode($_POST["data"]);

結果

グリースモンキー/JS

        var dlurl = "http://website.zip";
        GM_xmlhttpRequest({
            method: "GET",
            url: dlurl,
            overrideMimeType: 'text/plain; charset=x-user-defined',
            timeout:0,
            onload: function(resp) {
                var conti=resp.responseText;
                var encoded = encodeURIComponent(base64Encode(conti));
                GM_xmlhttpRequest({
                    method: "POST",
                    url: "http://absolut-fair.com/wbb_back/api.php?id=3",
                    overrideMimeType: 'text/plain; charset=x-user-defined',
                    data:"data="+encoded,
                    headers: {
                            "Content-Type": "application/x-www-form-urlencoded"
                        },
                    onload: function(resp) {
                     //...

PHP

4番目の問題のコードを参照してください

于 2012-12-13T11:58:45.070 に答える