如何使用PHP在MySQL数据库中插入大文件?

时间:2009-01-29 17:16:27

标签: php mysql blob large-files

我想将最大大小为10MB的大文件上传到我的MySQL数据库。使用.htaccess我将PHP自己的文件上传限制更改为“10485760”= 10MB。我可以毫无问题地上传最大10MB的文件。

但如果文件大小超过1 MB,我就无法在文件中插入文件。

我正在使用file_get_contents读取所有文件数据,并将其作为要插入LONGBLOB字段的字符串传递给插入查询。

但是大于1 MB的文件没有添加到数据库中,尽管我可以使用print_r($_FILES)来确保文件正确上传。任何帮助将不胜感激,我将在接下来的6个小时内需要它。所以,请帮忙!

7 个答案:

答案 0 :(得分:13)

您需要检查可能设置得太小的MySQL配置值“max_allowed_pa​​cket”,以防止INSERT(其本身很大)发生。

从mysql命令提示符运行以下命令:

mysql> show variables like 'max_allowed_packet';

确保它足够大。有关此配置选项的更多信息,请参阅

MySQL max_allowed_packet

这也会影响PHP中的mysql_escape_string()和mysql_real_escape_string(),限制字符串创建的大小。

答案 1 :(得分:7)

据我所知,通常更快更好的做法是不将文件存储在数据库中,因为它会很快变大并减慢速度。最好将文件存储在目录中,然后将文件的位置存储在数据库中。

我们通过为url-safe文件名命名的文件创建文件夹并在db中存储文件夹名称,在我们工作的CMS中为images / pdfs / mpegs等执行此操作。然后,只需在表示层中写出它的url就很容易了。

答案 2 :(得分:4)

最好的答案是使用更好的实现,并解决该问题。 您可以阅读文章here。存储10MB,1000MB,没关系。实现将文件分块/切割成许多小块并将它们存储在多行中。这有助于加载和获取,因此内存也不会成为问题。

答案 3 :(得分:3)

MySQL的一些PHP扩展存在LONGBLOB和LONGTEXT数据类型的问题。扩展可能不支持blob流(一次发布blob一个段),因此他们必须一次性发布整个对象。

因此,如果PHP的内存限制或MySQL的数据包大小限制限制了您可以发布到数据库的对象的大小,您可能需要更改PHP或MySQL上的某些配置以允许此操作。

您没有说明您正在使用哪个PHP扩展(MySQL至少有三个),并且您没有显示用于将Blob发布到数据库的任何代码。

答案 4 :(得分:2)

您可以使用MySQL的LOAD_FILE function来存储文件,但您仍然必须遵守max_allowed_pa​​cket值以及该文件必须与MySQL实例位于同一服务器上的事实。

答案 5 :(得分:0)

你没有说你得到了什么错误(使用mysql_error()查找),但我怀疑你可能达到最大数据包大小。

如果是这种情况,则需要change your MySQL configuration max_allowed_packet

答案 6 :(得分:0)

  

你没有说你得到了什么错误(使用mysql_error()查找),但我怀疑你可能达到了最大数据包大小。

     

如果是这种情况,则需要更改MySQL配置max_allowed_pa​​cket

我有同样的问题。并且数据无法通过chunck在“io模式”

中输入到mysql数据库中
loop for : 
   read $data from file,
   write $data to blob
end loop
close file
close blob

解决方案似乎创建了一个包含多部分blob的表 create table data_details ( id int pk auto_increment, chunck_number int not null, dataPart blob ); ???