php 中文件名 x00,如何根据RFC 2231在PHP中编码文件名?

解决方法:

我认为应该这样做:

function rfc2231_encode($name, $value, $charset='', $lang='', $ll=78) {

if (strlen($name) === 0 || preg_match('/[\x00-\x20*\'%()<>@,;:\\\\"\/[\]?=\x80-\xFF]/', $name)) {

// invalid parameter name;

return false;

}

if (strlen($charset) !== 0 && !preg_match('/^[A-Za-z]{1,8}(?:-[A-Za-z]{1,8})*$/', $charset)) {

// invalid charset;

return false;

}

if (strlen($lang) !== 0 && !preg_match('/^[A-Za-z]{1,8}(?:-[A-Za-z]{1,8})*$/', $lang)) {

// invalid language;

return false;

}

$value = "$charset'$lang'".preg_replace_callback('/[\x00-\x20*\'%()<>@,;:\\\\"\/[\]?=\x80-\xFF]/', function($match) { return rawurlencode($match[0]); }, $value);

$nlen = strlen($name);

$vlen = strlen($value);

if (strlen($name) + $vlen > $ll-3) {

$sections = array();

$section = 0;

for ($i=0, $j=0; $i

$j = $ll - $nlen - strlen($section) - 4;

$sections[$section++] = substr($value, $i, $j);

}

for ($i=0, $n=$section; $i

$sections[$i] = " $name*$i*=".$sections[$i];

}

return implode(";\r\n", $sections);

} else {

return " $name*=$value";

}

}

请注意,此函数期望在单独的行中使用输出,并在其前进行适当的换行(即CRLF),例如:

"Content-Type: application/x-stuff;\r\n".rfc2231_encode('title', 'This is even more ***fun*** isn\'t it!', 'us-ascii', 'en', 48)

输出为:

Content-Type: application/x-stuff;

title*0*=us-ascii'en'This%20is%20even%20more%20;

title*1=%2A%2A%2Afun%2A%2A%2A%20isn%27t%20it!

标签:http,mime,php,rfc2231

来源: https://codeday.me/bug/20191208/2093618.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值