Php Can';t在mySQL中以blob形式存储.pdf文件
因此,我尝试将PDF文件上载到mySQL blob中,插入表行,但在fileContent(mediumBlob类型)中,它始终显示为[blob 0 B],并且在下载文件时,它以0字节下载。我回显了$content,它显示了pdf文件的特殊字符Php Can';t在mySQL中以blob形式存储.pdf文件,php,mysql,blob,Php,Mysql,Blob,因此,我尝试将PDF文件上载到mySQL blob中,插入表行,但在fileContent(mediumBlob类型)中,它始终显示为[blob 0 B],并且在下载文件时,它以0字节下载。我回显了$content,它显示了pdf文件的特殊字符 $erro = ''; $tipo = ''; if (isset($_POST['submit']) && isset($_POST['text']) && $_POST['text'] !== null &&a
$erro = '';
$tipo = '';
if (isset($_POST['submit']) && isset($_POST['text']) && $_POST['text'] !== null && isset($_POST['userID']))
{
if(preg_match('/^[a-z0-9-]+$/',$_POST['text']) && strlen($_POST['text']) < 15 )
{
if (substr($_FILES['file']['name'], -3, 3) == "pdf" && $_FILES["file"]["size"] < 1000000)
{
if ($_FILES["file"]["error"] > 0)
{
$erro = "Problema: " . $_FILES["file"]["error"];
$tipo = 'erro';
}
else
{
$_FILES["file"]["name"] = $_POST['text'].'.pdf';
$erro = "Ficheiro guardado com sucesso.";
$tipo = 'sucesso';
}
}
else
{
$erro = "Apenas .PDF com menos de 10 Mb são permitidos!";
$tipo = 'erro';
}
}
else
{
$erro = "Nome inválido";
$tipo = 'erro';
}
if ($tipo == 'sucesso')
{
$content = $db->real_escape_string(file_get_contents($_FILES['file']['tmp_name']));
if ($_FILES["file"]["size"] > 0)
{
$smt = $db->prepare('INSERT into uploads (userRefID,fileName,fileType,fileSize,fileContent,uploadDate) values(?,?,?,?,?,?)');
$smt->bind_param('issibs', $_POST['userID'], $_FILES["file"]["name"], $_FILES["file"]["type"], $_FILES["file"]["size"], $content ,date(c));
$smt->execute();
$smt->close();
}
}
}
$erro='';
$tipo='';
if(isset($\u POST['submit'])和&isset($\u POST['text'])和&$\u POST['text']!==null和&isset($\u POST['userID']))
{
如果(预匹配('/^[a-z0-9-]+$/',$后['text'])和&strlen($后['text'])<15)
{
如果(substr($\u FILES['file']['name'],-3,3)=“pdf”&&&$\u FILES[“file”][“size”]<1000000)
{
如果($\u文件[“文件”][“错误”]>0)
{
$erro=“Problema:”.$\u文件[“文件”][“错误”];
$tipo='erro';
}
其他的
{
$\u FILES[“file”][“name”]=$\u POST['text']..pdf';
$erro=“Ficheiro guardado com成功。”;
$tipo='successo';
}
}
其他的
{
$erro=“Apenas.PDF com menos de 10 Mb圣佩尔米蒂多斯!”;
$tipo='erro';
}
}
其他的
{
$erro=“Nome inválido”;
$tipo='erro';
}
如果($tipo=='sucesso')
{
$content=$db->real_escape_字符串(file_get_contents($_FILES['file']['tmp_name']);
如果($\u文件[“文件”][“大小”]>0)
{
$smt=$db->prepare('INSERT-into-uploads(userRefID,fileName,fileType,fileSize,fileContent,uploadDate)值(?,,,,,,,,,,,,));
$smt->bind_param('issibs'、$_POST['userID']、$_FILES[“file”][“name”]、$_FILES[“file”][“type”]、$_FILES[“file”][“size”]、$content、date(c));
$smt->execute();
$smt->close();
}
}
}
我做错了什么?根据您的要求,您不应该直接在bind\u param
中传递blob,而是使用发送长数据
以下是一个示例,来自的文档:
$stmt = $mysqli->prepare("INSERT INTO messages (message) VALUES (?)");
$null = NULL;
$stmt->bind_param("b", $null);
$fp = fopen("messages.txt", "r");
while (!feof($fp)) {
$stmt->send_long_data(0, fread($fp, 8192));
}
fclose($fp);
$stmt->execute();
这个blob中大约有多少字节?MySQL设置max\u allowed\u packet
将对此有发言权。默认情况下,它设置为16MB,因此这是您的最大查询长度。Im上载的文件有131Kb。为什么长度会超过这个值?这不是问题的根本原因,但我认为在传递内容之前,您不需要real\u escape\u string
内容,因为您正在使用bind\u param
为您处理此问题。我尝试了不使用它,结果相同。现在我测试了一个3Kb的PDF,同样的结果…我现在试着使用它。我得到了相同的结果[BLOB 0 B]send\u long\u data
的第一个参数是SQL语句中的参数编号。所以这里应该是4,而不是0。