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

标签 php android ajax canvas

开满花!

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

  1. 从 Canvas 数据生成图像。
  2. 使用 PHP 通过 AJAX 将图像写入我的服务器。 (目录权限777)
  3. 利润。

到目前为止,我遇到的唯一问题是使用标准的 Android“浏览器”浏览器。 我已经能够使用该项目支持的浏览器列表成功保存图像。 (Safari、Firefox、Chrome、IE9+)。但是,当我在 Android 浏览器上进行测试时,PHP 正在 将文件保存到正确的目录,但为 0 字节。我在 Android v. 4.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 字节)

在此先感谢您的帮助!

最佳答案

非常感谢@pilsetnieks 的帮助。解决方案主要在我上面解释的范围之外。我使用上面的 PHP 方法来处理 jpeg 和 png。

显然,

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

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

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

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

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

关于php - Base64 -> AJAX -> PHP 在 Android 股票浏览器上写入 0 字节文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16286542/

相关文章:

php - 将以下 MySQL 查询转换为等效的 Codeigniter

android - 在解析中,发送的推送始终为 0

jquery - 在mvc中实现部分 View 分页的最佳方式

android - 通过 ID token 从服务器检索 Google 用户数据

android - 我应该为我的应用程序使用 ThreadPool 还是 IntentService?

javascript - jquery 的 CORS 错误

ajax - 如果在我们发出 Ajax 请求时互联网出现故障,那么如何向用户反馈互联网出现故障?

php - linux 命令运行带参数的 php 文件函数

php - 除了 docker 容器中的两个用户之外,如何为我的桌面 Ubuntu 机器的用户授予对 docker 卷的完全权限?

PHP 统计每天创建一行的站点 View