【问题标题】:what is preventing base64_decode from working for large files/images是什么阻止 base64_decode 处理大文件/图像
【发布时间】:2014-10-13 12:46:33
【问题描述】:

我已经实现了三个 php 脚本,其中两个是在 stackoverflow 上提出的,以解决较大图像的 base64_decode 不起作用的问题。在这一点上,我已经放弃了 php 脚本,只是想知道可能需要进行什么服务器升级才能使其正常工作。所有这三个都可以在具有任何分辨率的一台服务器上工作,但在另一台服务器上获得的最大分辨率约为 1680 x 800(文件大小约为 140 kb)。除此之外,它会失败并输出一个空图像(文件大小 0 kb)。数据从 Flash 应用程序发布。我可以看到两台服务器之间的唯一区别是 php 内存限制(256 MB 与 128 MB)。会是这样吗?感谢您的任何建议!

尝试的php脚本复制如下:

版本 1:

$png = base64_decode($_POST['imagedata']);
header('Content-Type: image/png');
header("Content-Disposition: attachment; filename=".$_GET['name']);
echo $png;

版本 2:

$encoded = $_POST['imagedata'];
$decoded = ""; 
for ($i=0; $i < ceil(strlen($encoded)/256); $i++) 
$decoded = $decoded . base64_decode(substr($encoded,$i*256,256));    
header('Connection: Keep-alive');
header('Content-Type: image/png');
header("Content-Disposition: attachment; filename=".$_GET['name']);
echo $decoded;

版本 3:

$data = $_POST['imagedata'];
$target = 'img_'.date('Y-m-d-H-s').'.png';

$whandle = fopen($target,'w');
stream_filter_append($whandle, 'convert.base64-decode',STREAM_FILTER_WRITE);

fwrite($whandle,$data);
fclose($whandle);
header("Content-Length: " . filesize($target));
header("Content-Disposition: attachment; filename=" . basename($target));
readfile($target);
unlink($target);

【问题讨论】:

  • 请添加html表单或说明获取imagedata内容的方式。
  • 图片数据来自 Flash 应用
  • 您能否将flash post数据捕获到文件中以检查是否正确捕获并且具有正确的b64格式。?例如,添加第一个和最后 20 个字符以及大小(字符数)。 B64 需要有一些规则才能正确。如果数据不正确,base64_decode 函数将返回 FALSE 而不是任何数据。
  • 嗯,它在一台服务器上运行良好,但在另一台服务器上运行良好,并且在较低分辨率下都运行良好......所以这表明输出是正确的,但这是服务器限制?

标签: php image post base64 png


【解决方案1】:

可能是内存相关的问题:帖子大小限制或 php 内存使用限制。

  • 使用 xdebug 检查脚本的内存消耗:http://xdebug.org/docs/execution_trace。您的脚本不应超过 php.ini 文件中的 memory_limit 参数:http://php.net/manual/fr/ini.core.php#ini.memory-limit
  • 检查您的 php.ini 中的 post_max_size(应该大于您的最大图像大小)
  • 检查您的网络服务器是否对发布数据有任何限制。
  • 检查您的日志:如果 base64_encode 编码不正确,则应该在某处出现错误消息。

【讨论】:

  • 谢谢!这是一个客户端服务器,所以让他们安装 xdebug 可能很棘手,但希望他们可以。 post_max_size 为 55M(最大图像大小仅为 140 kb 左右)。是否有任何其他帖子限制可能导致此问题?
  • 刚刚确认很遗憾主机不支持 XDEBUG...还有其他方法可以检查内存使用情况吗?
  • 我刚刚使用了 echo memory_get_usage() 并输出“1,795,496”,远低于 128 MB 的限制...所以我猜问题既不是 post_max_size 也不是 php 内存限制?
  • 好像是suhosin.post.max_value_length
  • 最大post size可以被web服务器限制(例如nginx:nginx.org/en/docs/http/…)。
猜你喜欢
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
  • 2012-03-21
  • 2013-10-23
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多