2016-12-07 67 views
0

我有一些连接到MSSQL的php代码,查找一些值并检索以二进制格式存储的文件。该表具有文件名,标题和二进制数据。目前我的代码正在按预期下载文件,但是,如果文件名中有一个空格,则会缩短名称,就好像该空间充当了分隔符一样。例如值为db“这是一个示例file.pdf”输出文件名“This”,浏览器识别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),并以某种方式被打破了“内容处置”标题行。研究将我带到了这个页面,但是关于如何处理VARCHAR并不是很清楚,当我尝试通过猜测(见下文)来“破解”它并获得文件名“index.php”(虽然它下载了文件)

$filename = sqlsrv_get_field($stmt, 1, SQLSRV_PHPTYPE_VARCHAR); 

我也很到位故障标题行的尝试这样做:

$filename = sqlsrv_get_field($stmt, 1, SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_BINARY))) 

它仍然切断文件名。如果文件名中没有空格,则代码执行完美。

奖金:有没有人知道我可以如何将文件保存到文件系统而不是下载对话框?此代码是数据迁移脚本我写的概念证明和这也将是非常有益的:)

+0

我不熟悉PHP,但我遇到类似的问题与Perl和其他语言。有可能,你必须用引号括起$ filename(或者PHP中相应的替代方法......)?有点像创建快捷方式时需要处理窗口路径和文件名?可能看起来像这样:header(“Content-Disposition:attachment; filename ='$ filename'”); – Tyron78

+0

感谢您的回应,尝试了它,现在我得到 **'This ** 它将单引号添加到文件名的开头! – Daniel

+0

正如我所说:我不太熟悉PHP。我试图实现的是,标题看起来像这样:Content-Disposition:attachment; filename =“$ filename”或Content-Disposition:附件; filename ='$ filename',其中$ filename必须由您的字符串替换。例如内容处理:附件;文件名=“这是一个示例file.pdf” – Tyron78

回答

1

请尝试以下操作:串联标题如下:

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

并保存文件通过:

function file_put_contents()