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)))
它仍然切断文件名。如果文件名中没有空格,则代码执行完美。
奖金:有没有人知道我可以如何将文件保存到文件系统而不是下载对话框?此代码是数据迁移脚本我写的概念证明和这也将是非常有益的:)
我不熟悉PHP,但我遇到类似的问题与Perl和其他语言。有可能,你必须用引号括起$ filename(或者PHP中相应的替代方法......)?有点像创建快捷方式时需要处理窗口路径和文件名?可能看起来像这样:header(“Content-Disposition:attachment; filename ='$ filename'”); – Tyron78
感谢您的回应,尝试了它,现在我得到 **'This ** 它将单引号添加到文件名的开头! – Daniel
正如我所说:我不太熟悉PHP。我试图实现的是,标题看起来像这样:Content-Disposition:attachment; filename =“$ filename”或Content-Disposition:附件; filename ='$ filename',其中$ filename必须由您的字符串替换。例如内容处理:附件;文件名=“这是一个示例file.pdf” – Tyron78