2

オーバーフロー!

サーバー上のディレクトリにファイルを保存する際に奇妙な問題が発生しました。フローは次のとおりです。

  1. キャンバス データからイメージを生成します。
  2. PHPを使用して、AJAX経由でサーバーに画像を書き込みます。(ディレクトリのパーミッションは 777 です)
  3. 利益。

私がこれまでに経験した唯一の問題は、標準の Android の「ブラウザ」ブラウザを使用しているときです。このプロジェクトでサポートされているブラウザーのリストを使用して、画像を正常に保存できました。(Safari、Firefox、Chrome、IE9+)。ただし、Android ブラウザでテストすると、PHPファイルを正しいディレクトリに保存していますが、0 バイトです。私はAndroid v. 4.1.1でテストしています

私の質問は、なぜこの 1 つのケースで 0 バイトのファイルを取得しているのかということです。どうすればこれを修正できますか?

私は答えを見つけようとしてGoogleとstackoverflowのいたるところにいましたが、これまでに約20の異なるソリューションをテストしたに違いありません。同じコードを長い間見つめてきたので、間違いが簡単に見落とされているのではないかと思っています。

AJAX 呼び出しは次のとおりです: (CoffeeScript)

$.ajax
        type: "POST"
        url: "#{servicesSrc}image-utils.php"
        data:
            post_method: "save_image"
            image_data: image.src
            name_prefix: @currentServiceString + "_"
        success: (response) =>
            doStuff(response) # <-- redacted method name
        error: (jqXHR, textStatus, errorThrown) ->
            console.error("storeTempUserImage :: Error: #{textStatus}", errorThrown)

PHP: ('REDACTED/FILE/PATH') は正しく、すべてのシナリオで使用されますが、表示できません。

$randomID = get_random_string();
$imageData = $_POST["image_data"];
$imageData = str_replace("data:image/jpeg;base64,", "", $imageData);
$imageData = str_replace(" ", "+", $imageData);
$data = base64_decode($imageData);
$namePrefix = (isset($_POST["name_prefix"])) ? $namePrefix = $_POST["name_prefix"] : $namePrefix = "";
$absoluteURL = $namePrefix.$randomID.".jpg";
$destinationURL = "REDACTED/FILE/PATH" . $absoluteURL;
$fp = fopen($destinationURL, "wb");
fwrite($fp, $data);
fclose($fp);
echo $absoluteURL;

正しく保存された画像と不適切に保存された画像のサンプル出力: twitter_jKbxRIt3NRw8Nd1ucJFcDSrMUBPs9H7M.jpg 98 KB (97,866 バイト) twitter_LLAwIET5VJDO4LXvD4O0hsngnj2UYata.jpg 0 B (0 バイト)

助けてくれてありがとう!

4

1 に答える 1