Php android 2.3上强制下载图像原始数据已损坏
我正试图开发一种机制,通过php强制下载画布作为图像。以下代码适用于chrome桌面,但不适用于Android 2.3股票浏览器 HTML和JavaScript: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
函数下载图像()
{
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;
?>