Использование fopen для загрузки файлов не работает с определенными именами файлов - PullRequest
0 голосов
/ 16 октября 2019

Я написал некоторый код для загрузки наших документов политики с нашего другого сервера:

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 Платежи банковским поставщикам (прямые дебеты, постоянные поручения и платежные поручения) Процедура ввода SAGE.pdf

Я получаю следующее предупреждение:

Предупреждение: file_put_contents (../../ Документы / Политики / Jhoots Frants FD SOP 27.01a Банковские платежи поставщикам (прямые дебеты, постоянные заказы и BAC) Ввод SAGEПроцедура / 27.01a / Jhoots FD SOP 27.01a Платежи банковским поставщикам (прямые дебеты, постоянные поручения и платежные поручения) Процедура ввода SAGE.pdf) [function.file-put-contents]: не удалось открыть поток: нет такого файла или каталога

У меня была эта проблема со многими другими документами, но я исправил ее, реализовав метод rawurlencode для переменной downloadLink.

Я знаю, что это ЧТО-ТО связано скак это кодИмя, но я не могу понять это.

Если я повторяю ссылку на скачивание и открываю ее в своем браузере, он находит документ просто отлично.

Есть идеи?

1 Ответ

1 голос
/ 16 октября 2019

После многих головных болей я понял, что проблема заключается в длине имени файла, когда я пытался зайти в каталог и сохранить его вручную. С тех пор я использовал идентификатор для одного из каталогов, и он отлично работает.

...