首页 > 解决方案 > 使用 fopen 下载文件不适用于某些文件名

问题描述

我编写了一些代码来从我们的其他服务器下载我们的政策文件:

for($i = 0; $i < count($newObject->policies); $i++) {
    $newPolicy = $newObject->policies[$i];
    $newPolicy->name = htmlspecialchars_decode(preg_replace("/(.*?)(\W+)?$/", "$1", $newPolicy->name)); //Fixes &amp; 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

我知道它与名称的编码方式有关,但我无法弄清楚。

如果我回显下载链接,并在我的浏览器中打开它,它会发现该文档很好。

有任何想法吗?

标签: phpdownloadfopen

解决方案


经过多次头痛后,当我尝试进入目录并手动保存时,我发现问题出在文件名的长度上。我已经为其中一个目录使用了一个 ID,它工作正常。


推荐阅读