在Android 2.3上强制下载图像原始数据已损坏

时间:2012-12-28 17:22:02

标签: php javascript mobile-website

我正在尝试开发一种机制,通过强制通过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上执行“另存为”以下载图像。

2 个答案:

答案 0 :(得分:1)

我最近遇到了管理HTTP标头的麻烦:确保在发送之前没有压缩数据的模块(例如:apache2的mod_deflate)。当您发送HTTP答案时,您指示的是带有标题的长度(“Content-Length:”。strlen($ source)); 如果使用压缩,则此长度为False。也许Android浏览器仍在等待数据,最后关闭图像,因为它已损坏。

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

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

答案 1 :(得分:0)

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

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