PHP上传到MySql
我正试图在MySql数据库中存储基于的文件。在您建议我将文件存储在文件系统而不是数据库中之前,上载的文件将被存储并与数据库中的记录相关。我可以保留文件的路径和文件名,但我希望用户能够通过web界面直接修改和删除文件。所以,让我们假设在数据库中存储是一个不错的选择,而不讨论其他选择 我的问题是,当我去下载文件时,MySql数据库中BLOB返回的数据与我在测试中上传的数据不完全一样。如果我使用addslashes的函数,那么从二进制角度来看,它是完全关闭的。如果我从例程中删除该函数,那么我会更接近它 使用二进制Diff应用程序,我可以看到,虽然不使用addslashes,但返回的文件数据在文件的开头有一个额外的数据字节,而在文件的结尾又少了一个字节。由于下载的这一小功能,文件的其余数据被一个偏移 我正在使用表单提交数据,enctype设置为多部分/表单数据。这里有一些代码,我正在使用它来让所有的工作<代码中的strong>DAL引用了我为数据访问层创建的类。它处理所有保存和检索例程,并且似乎没有注入任何新数据。在文件进入DAL类保存之前,我查看了文件的内容,额外的字节已经存在 上传PHP上传到MySql,php,mysql,upload,Php,Mysql,Upload,我正试图在MySql数据库中存储基于的文件。在您建议我将文件存储在文件系统而不是数据库中之前,上载的文件将被存储并与数据库中的记录相关。我可以保留文件的路径和文件名,但我希望用户能够通过web界面直接修改和删除文件。所以,让我们假设在数据库中存储是一个不错的选择,而不讨论其他选择 我的问题是,当我去下载文件时,MySql数据库中BLOB返回的数据与我在测试中上传的数据不完全一样。如果我使用addslashes的函数,那么从二进制角度来看,它是完全关闭的。如果我从例程中删除该函数,那么我会更接近它
if(isset($_POST['upload']) && $_FILES['userfile']['size'] > 0)
{
$fp = fopen($_FILES['userfile']['tmp_name'], 'r');
$_FILES['userfile']['content'] = fread($fp, $_FILES['userfile']['size']);
$_FILES['userfile']['content'] = addslashes($_FILES['userfile']['content']);
fclose($fp);
if(!get_magic_quotes_gpc())
{
$_FILES['userfile']['name'] = addslashes($_FILES['userfile']['name']);
}
$fileDAL = new DAL("files");
$newID = $fileDAL->SaveItem($_FILES['userfile'], false);
echo "<br>File ".$_FILES['userfile']['name']." uploaded as ID $newID<br>";
}
if(isset($_GET['id']))
{
$id = $_GET['id'];
$objFiles = new DAL('files');
$objFile = $objFiles->GetItem($id);
header("Content-length: $objFile->size");
header("Content-type: $objFile->type");
header("Content-Disposition: attachment; filename=$objFile->name");
echo $objFile->content;
exit;
}
使用mysql\u real\u escape\u string()。 摘录自其手册页: 转义未转义的_字符串中的特殊字符,同时考虑连接的当前字符集,以便将其安全地放置在mysql_查询()中如果要插入二进制数据,则必须使用此功能 因此,我将代码的转义部分更改为:
if( get_magic_quotes_gpc() )
{
$_FILES['userfile']['name'] = stripslashes( $_FILES['userfile']['name'] );
}
$_FILES['userfile']['name'] = mysql_real_escape_string( $_FILES['userfile']['name'] );
事实证明,在执行此代码之前,我在头文件中的PHP文件末尾添加了一个额外的换行符或回车符。写入时会导致标头在二进制数据中包含换行符(OA)以保存文件。您是否意识到可以使用
unlink()
从硬盘删除文件?您不需要将文件存储在数据库中就可以解决这个问题。您的文件是否大于16MB?如果是这样的话,您需要将其分块到数据库中以绕过大小限制。addslashes()完全是垃圾,早就应该从PHP中暴力删除。我会尝试一下。听起来很合理。谢谢你的信息。