使用 fopen 下载文件不适用于某些文件名
Using fopen to download files isn't working with certain file names
我已经编写了一些代码来从我们的其他服务器下载我们的保单文件:
for($i = 0; $i < count($newObject->policies); $i++) {
$newPolicy = $newObject->policies[$i];
$newPolicy->name = htmlspecialchars_decode(preg_replace("/(.*?)(\W+)?$/", "", $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 Bank Supplier Payments (Direct Debits, Standing Orders & BACs) SAGE Inputting Procedure.pdf
我收到以下警告:
Warning: file_put_contents(../../Intranet Docs/Policies/Jhoots FD SOP 27.01a Bank Supplier Payments (Direct Debits, Standing Orders & BACs) SAGE Inputting Procedure/27.01a/Jhoots FD SOP 27.01a Bank Supplier Payments (Direct Debits, Standing Orders & BACs) SAGE Inputting Procedure.pdf) [function.file-put-contents]: failed to open stream: No such file or directory
我在很多其他文档中都遇到过这个问题,但通过为 downloadLink
变量实施 rawurlencode
方法解决了这个问题。
我知道它与名称的编码方式有关,但我不太明白。
如果我回显下载 link,并在我的浏览器中打开它,它会发现该文件很好。
有什么想法吗?
折腾了很多次之后,当我试图进入目录并手动保存时,我发现问题出在文件名的长度上。我已经为其中一个目录使用了一个 ID,它工作正常。
我已经编写了一些代码来从我们的其他服务器下载我们的保单文件:
for($i = 0; $i < count($newObject->policies); $i++) {
$newPolicy = $newObject->policies[$i];
$newPolicy->name = htmlspecialchars_decode(preg_replace("/(.*?)(\W+)?$/", "", $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 Bank Supplier Payments (Direct Debits, Standing Orders & BACs) SAGE Inputting Procedure.pdf
我收到以下警告:
Warning: file_put_contents(../../Intranet Docs/Policies/Jhoots FD SOP 27.01a Bank Supplier Payments (Direct Debits, Standing Orders & BACs) SAGE Inputting Procedure/27.01a/Jhoots FD SOP 27.01a Bank Supplier Payments (Direct Debits, Standing Orders & BACs) SAGE Inputting Procedure.pdf) [function.file-put-contents]: failed to open stream: No such file or directory
我在很多其他文档中都遇到过这个问题,但通过为 downloadLink
变量实施 rawurlencode
方法解决了这个问题。
我知道它与名称的编码方式有关,但我不太明白。
如果我回显下载 link,并在我的浏览器中打开它,它会发现该文件很好。
有什么想法吗?
折腾了很多次之后,当我试图进入目录并手动保存时,我发现问题出在文件名的长度上。我已经为其中一个目录使用了一个 ID,它工作正常。