Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php android 2.3上强制下载图像原始数据已损坏_Php_Javascript_Mobile Website - Fatal编程技术网

Php android 2.3上强制下载图像原始数据已损坏

Php android 2.3上强制下载图像原始数据已损坏,php,javascript,mobile-website,Php,Javascript,Mobile Website,我正试图开发一种机制,通过php强制下载画布作为图像。以下代码适用于chrome桌面,但不适用于Android 2.3股票浏览器 HTML和JavaScript: 函数下载图像() { document.getElementById('action')。value='downloadfile'; document.getElementById('source').value=document.getElementById('finalimage').src; document.getElemen

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

HTML和JavaScript:
函数下载图像()
{
document.getElementById('action')。value='downloadfile';
document.getElementById('source').value=document.getElementById('finalimage').src;
document.getElementById('user')。value=userId;
document.getElementById('imageForm').submit();
}
PHP代码:

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

[更新] 我只是通过输出到浏览器进行测试,然后尝试从那里保存图像。我正在显示图像,但在保存图像时,文件命名方案是*.html
看起来可能是安卓股票浏览器的bug。我能够将图像保存到服务器,但仍然无法从那里输出缓冲区来下载图像。我必须输出一个常规html标记,然后在android上执行“另存为”以下载图像。

我最近在管理HTTP头时遇到一些问题:确保您没有在发送前压缩数据的模块(例如:mod_deflate for apache2)。当您发送HTTP应答时,您用标题(“内容长度:“.strlen($source)))指示is lenght; 如果使用压缩,则此长度为False。也许Android浏览器还在等待数据,并最终关闭图像,因为它已损坏

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


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

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


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

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

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;
?>