1

我建立了一个网页,用户可以在其中提交 PDF,然后将其插入到 mediumblob 中的 MySQL 数据库中,以便稍后检索。

这一切正常,除非 PDF 包含图像或嵌入字体,在这种情况下图像已损坏并且使用该字体的任何文本都会消失(Acrobat 会显示有关丢失字体的消息)。

我已经确定问题发生在我通过 mysql_real_escape_string_function 传递 pdf 数据时。我已在提交/检索时切换到 base64_encode/base64_decode,这解决了所有新文件的问题,但我有大约 25 个已经提交的 PDF,我需要能够阅读。

是否可以逆转 mysql_real_escape_string 的效果?或者这些文件是否已损坏无法修复?

4

4 回答 4

0

老实说,我不知道还能是什么。当我更改那段代码时,它解决了问题,并且我在网上发现了人们遇到同样问题的其他实例(但没有解决方案)。

这是插入代码:

function db_value( $mysqli, $value ) {
if( empty($value) )
    return "''";

if( get_magic_quotes_gpc() )
    $value = stripslashes($value);

if( !is_numeric($value) || ($value[0] == '0' && $value != 0) )
    $value = "'".mysqli_real_escape_string($mysqli, $value)."'";

return $value;
}

function saveToDatabase( $data, $fileTempName, $abstractFileName ) {
$fileHandle = fopen( $fileTempName, 'r' );
$abstractFile = fread( $fileHandle, filesize( $fileTempName ) );
fclose( $fileHandle );
$abstractFileMimeType = $fileUpload->get_mime();

$mysqli = connect_to_database();

if( $mysqli != FALSE ) {
    $insertQuery = "INSERT INTO `paper_submissions` (
        `name`,
        `affiliation`,
        `email`,
        `phone_number`,
        `title`,
        `abstract`,
        `abstract_file`,
        `abstract_file_name`,
        `abstract_file_mime_type`,
        `requests_financial_support`,
        `HTTP_USER_AGENT`,
        `REMOTE_ADDR`
    )
    VALUES ( 
        ".db_value( $mysqli, $data['submitter_name'] ).",
        ".db_value( $mysqli, $data['submitter_affiliation'] ).",
        ".db_value( $mysqli, $data['submitter_email'] ).",
        ".db_value( $mysqli, $data['submitter_phone'] ).",
        ".db_value( $mysqli, $data['paper_title'] ).",
        ".db_value( $mysqli, $data['abstract_text'] ).",
        ".db_value( $mysqli, $abstractFile ).",
        ".db_value( $mysqli, $abstractFileName ).",
        ".db_value( $mysqli, $abstractFileMimeType ).",
        ".db_value( $mysqli, $data['request_financial_support'] ).",
        ".db_value($mysqli, $_SERVER['HTTP_USER_AGENT']).",
        ".db_value($mysqli, $_SERVER['REMOTE_ADDR'])."
    )";

    $insertResult = $mysqli->query( $insertQuery );

    close_database( $insertResult, $mysqli );

    return $insertResult;
}

return FALSE;
}

这是提取代码:

$selectQuery = "SELECT `abstract_file_name`, `abstract_file_mime_type`, `abstract_file`
FROM `paper_submissions`
WHERE `id` = ".db_value( $mysqli, $id );


$result = $mysqli->query( $selectQuery );

if( $result != FALSE ) {
if( $result->num_rows ) {
    $paper = $result->fetch_array( MYSQL_ASSOC );

    $fileSize = strlen( $paper['abstract_file'] );

    header( 'Date: '.gmdate( "D, d M Y H:i:s" ).' GMT' );
    header( 'Expires: Thu, 19 Nov 1981 08:52:00 GMT' );
    header( 'Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0' );
    header( 'Pragma: no-cache' );
    header( 'Content-Type: '.$paper['abstract_file_mime_type'].'; charset=utf-8' );
    header( 'Content-Length: '.$paper['abstract_file_size'] );
    header( 'Content-Disposition: inline; filename="'.$paper['abstract_file_name'].'"' );
    echo $paper['abstract_file'];
    exit();
}
}
于 2009-05-19T22:32:16.020 回答
0

奥拉富尔,

我从 php 手册中收集了它,甚至尝试了以下方法:

$search = array( "\\0", "\\n", "\\r", "\\\\", "\\'", "\\\"", "\Z", );
$replace = array( "\x00", "\n", "\r", "\\", "'", "\"", "\x1a" );
$desiredString = str_replace( $search, $replace, $escapedString );

这在处理文本时似乎工作得很好,但将其应用于二进制数据只会进一步降低 PDF 的质量(例如,段落丢失)。

于 2009-05-19T22:41:15.393 回答
0

当然,应该是可以修复的。你只需要弄清楚mysql_real_escape_string到底是做什么的。我相信您只需要删除紧接在 CR、LF、TAB、单引号、双引号、NUL 或其他斜杠之前的任何斜杠。应该是单行正则表达式修复。

于 2009-05-19T22:22:23.373 回答
0

mysql_real_escape_string()给这些字符加上反斜杠。

\x00, \n, \r, \, ', " and \x1a

问题是,如果你的二进制输出有反斜杠,它就是二进制数据,它可能很难修复。话虽如此,没有神奇的功能可以撤消此功能。

于 2009-05-19T22:26:15.143 回答