Base64 - > AJAX - > PHP在Android股票浏览器上写入0字节文件

时间:2013-04-29 19:21:06

标签: php android ajax canvas

overflowers!

将文件保存到服务器上的目录时,我遇到了一个奇怪的问题。流程如下:

  1. 从画布数据生成图像。
  2. 使用PHP通过AJAX将图像写入我的服务器。 (目录的权限是777)
  3. 利润。
  4. 到目前为止我唯一的打嗝是使用Android'浏览器'浏览器。 我已经能够使用我支持的浏览器列表为此项目成功保存图像。 (Safari,Firefox,Chrome,IE9 +)。但是,当我在Android浏览器上进行测试时,PHP 将文件保存到正确的目录,但是为0字节。我在Android v.4.1.1上测试

    我的问题是为什么在这种情况下我得到一个0字节的文件?我该如何解决这个问题?

    我一直在谷歌和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:('删除/文件/路径')是正确的,并在每个场景中使用,但我无法显示。

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

    提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

非常感谢@pilsetnieks的帮助。解决方案主要是在我上面解释的内容之外。我使用上面的PHP方法处理jpegs和pngs。

显然,

$imageData = str_replace("data:image/jpeg;base64,", "", $imageData);

只会处理jpeg图像。为了解决这个问题,我使用以下行来处理jpegs和pngs:

$imageData = substr($imageData, strpos($imageData, ",")+1);

此外,我从此行中删除了扩展名,因此该文件可以是以下类型:

$absoluteURL = $namePrefix.$randomID.".jpg";