2009-05-19 3 views
1

Я создал веб-страницу, где пользователи могут отправить PDF-файл, который затем вставляется в базу данных MySQL в среднюю ячейку для извлечения позже.php: изменение эффектов mysql_real_escape_string на двоичные файлы

Все это работает отлично, за исключением случаев, когда PDF содержит изображения или встроенные шрифты, и в этом случае изображения повреждаются, а текст с использованием шрифта исчезает (Acrobat отображает сообщение о недостающем шрифте).

Я решил, что проблема возникает из-за передачи данных в формате pdf через mysql_real_escape_string_function. Я перешел на base64_encode/base64_decode при отправке/поиске, который исправил проблему для всех новых файлов, но у меня есть около 25 уже отправленных PDF-файлов, которые мне нужно уметь читать.

Можно ли отменить эффекты mysql_real_escape_string? Или эти файлы повреждены без ремонта?

ответ

0

Несомненно, следует исправить. Вам просто нужно выяснить, точно, что делает mysql_real_escape_string. Я считаю, вам просто нужно удалить любые косые черты, которые непосредственно предшествуют CR, LF, TAB, одиночной кавычки, двойной кавычки, NUL или другой косой чертой. Должно быть однострочное исправление регулярного выражения.

1

mysql_real_escape_string() ставит обратную косую черту этих символов.

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

Дело в том, что если ваш двоичный выход имеет обратную косую черту он это двоичные данные, это может быть очень трудно исправить. При этом нет никакой магической функции, чтобы отменить эту функцию.

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(); 
} 
} 
0

Олафур,

я понял, что из руководства PHP, и даже попытался следующие :

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

Кажется, что это прекрасно работает при работе с текстом, но применение его к двоичным данным только дополнительно ухудшает PDF (например, абзацы отсутствуют).

+0

У вас могут быть обычные данные, соответствующие этим критериям, поэтому их трудно исправить. –

 Смежные вопросы

  • Нет связанных вопросов^_^