【问题标题】:Forced download of image raw data is corrupted on android 2.3在 android 2.3 上强制下载图像原始数据已损坏
【发布时间】:2012-12-28 17:22:02
【问题描述】:

我正在尝试开发一种机制,通过强制通过 php 下载画布作为图像下载。以下代码适用于 chrome 桌面,但不适用于 Android 2.3 普通浏览器。

HTML 和 JavaScript:

<script> function downloadImage()
{

    document.getElementById('action').value = 'downloadfile';
    document.getElementById('source').value = document.getElementById('finalimage').src;
    document.getElementById('user').value = userId;
    document.getElementById('imageForm').submit();
}
</script>
<html>
    <form id="imageForm" action="" method="post" enctype="application/x-www-form-urlencoded">
    <input type="hidden" name="source" id="source" value=""/>
    <input type="hidden" name="action" id="action" value="savefile"/>
     <input type="hidden" name="user" id="user" value=""/>
    </form>
</html>

PHP 代码:

<?php

header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"colouringbook-page.jpg\"");
    header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
    header("Pragma: no-cache");
    header("Content-transfer-encoding: binary");

        $source = $_REQUEST['source'];
        $source = base64_decode(substr($source, strpos($source, ",")+1));
        header("Content-Length: " . strlen($source));
        print $source;
        exit;
?>

我遇到的问题首先是“下载失败”。然后,当我设法成功下载时,图像已损坏。

[更新]

我只是通过输出到浏览器然后尝试从那里保存图像来进行测试。我正在显示图像,但在保存图像时,文件命名方案是 *.html

看起来它可能是一个 android 股票浏览器错误。我能够将图像保存到服务器,但仍然无法从那里输出缓冲区来下载图像。我必须输出一个常规的 html 标记,然后在 android 上执行“另存为”以下载图像。

【问题讨论】:

  • 在强制下载 .jpg 文件时,为什么要发送 application/octet-stream?应该是image/jpeg
  • 无论是它的应用程序/八位字节流还是图像/jpeg...它都不起作用。建议转到 application/octet-stream 以允许 android 自动检测它是什么类型的文件。另外我如何允许目录攻击?没有文件或目录读写?
  • 对不起,我看错了$source的来源。如果没有看到输入数据的示例,很难想象发布的是什么。 finalimage 看起来可能是base64 图像字符串?
  • 是的……它可以在 Chrome 桌面上运行。但我不明白为什么不在 Android 2.3 股票浏览器中。我开始认为 Android 中存在一些 base64 编码错误。私信给你发个链接?
  • 我碰巧有一台 Android 2.3 设备。您不能真正发送私人链接。您可以发表评论,然后将其删除。我可以在我的手机中查看它,但我不确定它会有什么帮助。

标签: php javascript mobile-website


【解决方案1】:

我最近在管理 HTTP 标头时遇到了一些麻烦:请确保您没有在发送前压缩数据的模块(例如:用于 apache2 的 mod_deflate)。当您发送 HTTP 答案时,您使用 header("Content-Length: " .strlen($source)); 如果使用压缩,此长度为 False。也许Android浏览器仍在等待数据并最终关闭图像,考虑到它已损坏。

如果这是您的问题,您可以尝试关闭此脚本的压缩(例如 apache2:apache_setenv('no-gzip', '1');) 或者您可以尝试不发送 Content-Length 信息。

编辑:您应该使用真正的 mimetype 来更好地帮助 Android 管理您的图像。

【讨论】:

    【解决方案2】:

    似乎正在发生的事情是 Android 设备正在尝试“重新请求”作为 POSTED 逻辑进程的进程。显然设备下载管理器没有发布任何内容。

    我想出的解决方案是使用会话来存储信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      相关资源
      最近更新 更多