2016-12-07 2 views
0

У меня есть код 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: Кто-нибудь знает, как я могу сохранить файл в файловой системе, а не иметь диалоговое окно загрузки? Этот код является доказательством концепции для переноса данных сценария, который я пишу, и это тоже было бы очень полезно :)

+0

Я не знаком с PHP, но столкнулся с аналогичными проблемами с perl и другими языками. Возможно ли, что вам нужно окружить $ filename кавычками (или соответствующей альтернативой в PHP ...)? Скорее всего, вам приходится иметь дело с Window path и именами файлов при создании ярлыков? Может выглядеть примерно так: header ("Content-Disposition: attachment; filename = '$ filename'"); – Tyron78

+0

Спасибо за ответ, попробовал, и теперь я получаю ** «Это ** он добавил одну цитату в начало имени файла! – Daniel

+0

Как я уже говорил, я не очень хорошо знаком с PHP. Я пытался добиться того, что заголовок выглядит примерно так: Content-Disposition: attachment; filename = "$ filename" или Content-Disposition: attachment; filename = '$ filename', где $ filename должно быть заменено вашей строкой. например Content-Disposition: вложение; filename = "Это пример file.pdf" – Tyron78

ответ

1

Пожалуйста, попробуйте следующее: сцепить заголовок следующим образом:

header('Content-Disposition: attachment; filename="'."$filename".'"'); 

И сохранить файл через:

function file_put_contents()