将上传的文件进行Base64编码,然后保存到数据库中。

15

我希望能把上传的文件进行 base64 编码,然后保存到 MySQL 数据库表的 Blob 类型列中。

我已经尝试使用 PHP 内置函数 base64_encode 加上文件变量,但似乎并不起作用。

有什么方法可以做到这一点吗?

原因在于,我不想将上传的文件移动到一个文件夹中。

谢谢。


1
在将文件存储到 blob 中之前,您不必对其进行 base64 编码。 - Sjoerd
你怎么在表格中保存数据? - John Kim
1
你可以将文件数据直接插入到你的 Blob 字段中。 - Arfeen
1
我的原因是我不想将上传的文件移动到文件夹中。--- 实际上这并不是“原因”。所谓“原因”是导致那种情况发生的事情。 - zerkms
1个回答

23

正如@Sjoerd和@zerkms正确指出的那样,您不需要这样做- Blob列用于存储原始二进制数据,因此您可以跳过Base64处理并插入文件的原始数据。

如果您想在数据库中存储图像(顺便说一句,我个人不喜欢这样做),最好存储原始数据- 对数据进行Base64编码会使其变大,并意味着必须在呈现图像之前对其进行解码,这增加了处理开销。

以下是如何插入原始二进制数据的方法(假设使用MySQL扩展):

$data = file_get_contents($_FILES['name_of_control']['tmp_name']);
$data = mysql_real_escape_string($data);

$query = "
  INSERT INTO table
    (`blob_column`)
  VALUES
    ('$data')
";

mysql_query($query);

如果你真的想对它进行Base64编码(这种情况下它可以存储在varchar中),只需添加一个 base64_encode() 调用即可:

$data = file_get_contents($_FILES['name_of_control']['tmp_name']);
$data = base64_encode($data);

// There is an argument that this is unnecessary with base64 encoded data, but
// better safe than sorry :)
$data = mysql_real_escape_string($data);

$query = "
  INSERT INTO table
    (`varchar_column`)
  VALUES
    ('$data')
";

mysql_query($query);

一个问题,Dave - 你说原始二进制数据可以直接存储在BLOB字段中,而不使用base64_encode。但是这不容易受到注入攻击吗?如果你使用mysql_real_escape_string,它似乎会(不可逆地)破坏某些常见的文件类型,比如PDF。到目前为止,我的印象是base64_encode是既转义文件,又保留精确内容的唯一方法...? - Topher Hunt
给 @TopherHunt:使用预处理语句。这样就完全安全了! - JDuarteDJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接