强制下载的图像原始数据是损坏的android 2.3


Forced download of image raw data is corrupted on android 2.3

我正试图开发一种机制,通过强制下载通过php下载画布作为图像。下面的代码可以在chrome桌面运行,但不能在Android 2.3的stock浏览器上运行。

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股票浏览器的bug。我能够将图像保存到服务器,但仍然无法从那里输出缓冲区以下载图像。我必须输出一个常规的html标签,然后在android上做"另存为"来下载图像。

我最近有一些麻烦与管理HTTP头:确保你没有一个模块,压缩数据发送之前(例如:mod_deflate为apache2)。当你发送你的HTTP应答时,你用报头("Content-Length: ")指明长度。strlen(源)美元);如果使用压缩,则此长度为False。也许Android浏览器仍在等待数据,最后关闭图像认为它已损坏。

如果这是你的问题,你可以尝试关闭这个脚本的压缩(例如apache2: apache_setenv('no-gzip', '1');)或者你可以试着不发送内容长度信息。

编辑:你应该使用真正的mime类型,以更好地帮助Android管理你的图像

似乎正在发生的是,Android设备正试图"重新请求"的进程,这是post逻辑进程。显然,设备下载管理器没有发布任何内容。

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