文件名被脚本缩短

时间:2016-12-07 07:49:40

标签: php sql-server

我有一些PHP代码连接到MSSQL,查找一些值并检索以二进制格式存储的文件。该表具有文件名,标题和二进制数据。目前我的代码正在按预期下载文件,但是,如果文件名中有空格,则名称会缩短,就好像空间充当分隔符一样。例如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);  
        } 

我怀疑问题是文件名在DB中存储为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:有谁知道如何将文件保存到文件系统而不是下载对话框?这段代码是我正在编写的数据迁移脚本的概念证明,也非常有用:)

1 个答案:

答案 0 :(得分:1)

请尝试以下操作:按如下方式连接标题:

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

并通过以下方式保存文件:

function file_put_contents()