php - 使用 fopen 下载文件不适用于某些文件名
问题描述
我编写了一些代码来从我们的其他服务器下载我们的政策文件:
for($i = 0; $i < count($newObject->policies); $i++) {
$newPolicy = $newObject->policies[$i];
$newPolicy->name = htmlspecialchars_decode(preg_replace("/(.*?)(\W+)?$/", "$1", $newPolicy->name)); //Fixes & etc, removes trailing spaces/dots/etc
$filePath = sprintf("../../Intranet Docs/Policies/%s/%s", $newPolicy->name, $newPolicy->version);
$fileName = sprintf("%s/%s", $filePath, $newPolicy->filename);
if(!file_exists($fileName)) {
if(!file_exists($filePath)) {
mkdir($filePath, 0777, true);
}
$downloadLink = sprintf("http://xxx/jhoots/documents/%s", rawurlencode($newPolicy->filename));
file_put_contents($fileName, fopen($downloadLink, 'r'));
exit;
}
}
现在,此代码适用于 90% 的文档。
但是,当我点击一个名称如下的文档时:
Jhoots FD SOP 27.01a 银行供应商付款(直接借记、常规订单和 BAC)SAGE 输入程序.pdf
我收到以下警告:
警告:file_put_contents(../../Intranet Docs/Policies/Jhoots FD SOP 27.01a 银行供应商付款(直接借记、常规和 BAC)SAGE 输入程序/27.01a/Jhoots FD SOP 27.01a 银行供应商付款(直接借记) , Standing Orders & BACs) SAGE Inputting Procedure.pdf) [function.file-put-contents]: failed to open stream: No such file or directory
我在很多其他文档中都遇到了这个问题,但通过实现变量的rawurlencode
方法来解决它。downloadLink
我知道它与名称的编码方式有关,但我无法弄清楚。
如果我回显下载链接,并在我的浏览器中打开它,它会发现该文档很好。
有任何想法吗?
解决方案
经过多次头痛后,当我尝试进入目录并手动保存时,我发现问题出在文件名的长度上。我已经为其中一个目录使用了一个 ID,它工作正常。
推荐阅读
- sql - 使用不匹配的复合主键连接两个表
- mysql - MySQL Workbench - 存储过程 - 错误 - 手册中没有参考
- python - 如何检查来自变量输入的 SQL 查询是否在 Python 中返回一行?
- java - 使用 Rest Template 从外部 api 返回特定数据
- angular - Angular Observable - 订阅但 html 不输出信息
- python - 如何打印列表中当前元素和前一个元素的总和
- ios - textfield.becomeFirstResponder 没有保持文本字段快速集中
- c - 我怎样才能写一个 if thats 与一个 else 相关,然后在它下面写一个 if 与另一个 else 相关?
- android - 浮动操作按钮背景模糊
- mysql - MySQL GROUP 基于其他列的列,但也排除基于第二列的重复项