Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP上传到MySql_Php_Mysql_Upload - Fatal编程技术网

PHP上传到MySql

PHP上传到MySql,php,mysql,upload,Php,Mysql,Upload,我正试图在MySql数据库中存储基于的文件。在您建议我将文件存储在文件系统而不是数据库中之前,上载的文件将被存储并与数据库中的记录相关。我可以保留文件的路径和文件名,但我希望用户能够通过web界面直接修改和删除文件。所以,让我们假设在数据库中存储是一个不错的选择,而不讨论其他选择 我的问题是,当我去下载文件时,MySql数据库中BLOB返回的数据与我在测试中上传的数据不完全一样。如果我使用addslashes的函数,那么从二进制角度来看,它是完全关闭的。如果我从例程中删除该函数,那么我会更接近它

我正试图在MySql数据库中存储基于的文件。在您建议我将文件存储在文件系统而不是数据库中之前,上载的文件将被存储并与数据库中的记录相关。我可以保留文件的路径和文件名,但我希望用户能够通过web界面直接修改和删除文件。所以,让我们假设在数据库中存储是一个不错的选择,而不讨论其他选择

我的问题是,当我去下载文件时,MySql数据库中BLOB返回的数据与我在测试中上传的数据不完全一样。如果我使用addslashes的函数,那么从二进制角度来看,它是完全关闭的。如果我从例程中删除该函数,那么我会更接近它

使用二进制Diff应用程序,我可以看到,虽然不使用addslashes,但返回的文件数据在文件的开头有一个额外的数据字节,而在文件的结尾又少了一个字节。由于下载的这一小功能,文件的其余数据被一个偏移

我正在使用表单提交数据,enctype设置为多部分/表单数据。这里有一些代码,我正在使用它来让所有的工作<代码中的strong>DAL引用了我为数据访问层创建的类。它处理所有保存和检索例程,并且似乎没有注入任何新数据。在文件进入DAL类保存之前,我查看了文件的内容,额外的字节已经存在

上传

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中暴力删除。我会尝试一下。听起来很合理。谢谢你的信息。