У меня есть код php, который подключается к MSSQL, просматривает некоторые значения и извлекает файл, который хранится в двоичном формате. Таблица имеет имя файла, заголовок и двоичные данные. В настоящее время мой код загружает файл, как ожидалось, однако, если в имени файла есть пробел, имя обрезается, как будто пространство действует как разделитель. например value в db «Это пример file.pdf», выданное имя файла «Это», и браузер распознает тип PDF.Имя файла сокращается по сценарию
Мой несколько функциональный код ниже:
/* Retrieve and display the data.
The return data is retrieved as a binary stream. */
if (sqlsrv_fetch($stmt))
{
$noticeID = sqlsrv_get_field($stmt, 0, SQLSRV_PHPTYPE_INT);
$filename = sqlsrv_get_field($stmt, 1, SQLSRV_PHPTYPE_STRING("UTF-8"));
$header = sqlsrv_get_field($stmt, 2, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_BINARY));
$download = sqlsrv_get_field($stmt, 3, SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_BINARY));
header('Content-Type: '.$header);
header("Content-Disposition: attachment; filename=$filename");
echo "Your file, $filename is ready for download";
fpassthru($download);
}
else
{
echo "Error in retrieving data.</br>";
print_r(sqlsrv_errors(), true);
}
Я подозреваю, что проблема в том, что имя файла хранится в виде VARCHAR (255) в БД и как-то ломает строку заголовка «Content-Disposition» , Исследования привели меня на эту страницу, но не очень понятно, как обращаться с VARCHAR, и когда я пытаюсь «взломать» его, угадывая (см. Ниже) и получая имя файла «index.php» (хотя он загружает файл)
$filename = sqlsrv_get_field($stmt, 1, SQLSRV_PHPTYPE_VARCHAR);
Я также попытался это вместо неисправного строки заголовка:
$filename = sqlsrv_get_field($stmt, 1, SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_BINARY)))
Он по-прежнему отрезает имя файла. Если в имени файла нет места, код выполняется отлично.
BONUS: Кто-нибудь знает, как я могу сохранить файл в файловой системе, а не иметь диалоговое окно загрузки? Этот код является доказательством концепции для переноса данных сценария, который я пишу, и это тоже было бы очень полезно :)
Я не знаком с PHP, но столкнулся с аналогичными проблемами с perl и другими языками. Возможно ли, что вам нужно окружить $ filename кавычками (или соответствующей альтернативой в PHP ...)? Скорее всего, вам приходится иметь дело с Window path и именами файлов при создании ярлыков? Может выглядеть примерно так: header ("Content-Disposition: attachment; filename = '$ filename'"); – Tyron78
Спасибо за ответ, попробовал, и теперь я получаю ** «Это ** он добавил одну цитату в начало имени файла! – Daniel
Как я уже говорил, я не очень хорошо знаком с PHP. Я пытался добиться того, что заголовок выглядит примерно так: Content-Disposition: attachment; filename = "$ filename" или Content-Disposition: attachment; filename = '$ filename', где $ filename должно быть заменено вашей строкой. например Content-Disposition: вложение; filename = "Это пример file.pdf" – Tyron78