Comment puis-je insérer des fichiers volumineux dans des bases de données MySQL à l'aide de PHP?
Je veux télécharger un fichier volumineux d'une taille maximale de 10 mo à ma base de données MySQL. À l'aide de .htaccess
j'ai changé PHP fichier propre limite de téléchargement pour "10485760" = 10 MO. Je suis en mesure de télécharger des fichiers jusqu'à 10 MO sans aucun problème.
Mais je ne peux pas insérer le fichier dans la base de données s'il est plus grand que la taille de 1 MO.
Je suis en utilisant file_get_contents
pour lire tous les fichiers de données et de les passer à la requête d'insertion comme une chaîne de caractères à insérer dans une LONGBLOB champ.
Mais les fichiers de plus de 1 MO ne sont pas ajoutés à la base de données, même si je peux utiliser print_r($_FILES)
à assurez-vous que le fichier est téléchargé correctement. Toute aide sera appréciée et que j'ai besoin d'elle dans les prochaines 6 heures. Donc, s'il vous plaît aider!
OriginalL'auteur anjan | 2009-01-29
Vous devez vous connecter pour publier un commentaire.
Pour autant que je sais que c'est généralement plus rapide et une meilleure pratique de ne pas stocker le fichier dans la base de données qu'il obtiendra massif très rapidement et de le ralentir. Il est préférable d'en faire un moyen de stocker le fichier dans un répertoire et ensuite il suffit de stocker l'emplacement du fichier dans la base de données.
Nous le faisons pour les images/pdf/mpeg etc dans le CMS que nous avons au travail par la création d'un dossier pour le fichier nommé à partir de l'url-sécurité nom du fichier et le stocker le nom du dossier dans la base de données. C'est facile il suffit d'écrire l'url de celui-ci dans la couche de présentation ensuite.
Même histoire ici, nous avons dû changer le système de fichiers. (DB maintenance est devenu lent et pénible)
Cela est généralement vrai pour mysql, parce que les gouttes ne sont pas de vrais blob, mais sont limités à 4 go (pour longblob). Véritable SGBD (Oracle, MSSQL, Firebird) n'ont pas cette limitation et aussi ne pas ralentir à tous. La manipulation de sauvegarde et de restauration est beaucoup plus facile quand tout est dans une seule base de données. De toute façon, si vous êtes coincé avec MySQL, vous pouvez utiliser mysqli_stmt_send_long_data pour diffuser le gros fichier en plusieurs segments.
J'ai expérimenté avec le système de fichiers de stockage. Je trouve que le maintien de la DB et la FS de synchronisation est une préoccupation supplémentaire... si quelqu'un supprime un fichier sur le FS? Que faire si un DB enregistrement est supprimé mais le fichier associé reste sur le FS? C'est compliqué de faire des DB opérations atomiques quand quelque chose en dehors de la DB est en cause.
Le stockage des fichiers sur le système de fichiers au lieu de la DB n'est pas une "meilleure pratique". C'est simplement une approche différente. Il existe de nombreuses raisons valables pour lesquelles vous aurez stocker des fichiers dans un DB au lieu de cela, la portabilité pour les débutants. C'est incroyable comment la mesure de la propagation du mythe de "ne pas stocker des fichiers dans la base de données" est, y compris l'hypothèse que cette résultats dans un système plus rapide.
OriginalL'auteur roborourke
Vous voulez vérifier la configuration de MySQL valeur "max_allowed_packet", qui pourrait être trop petit, la prévention de l'INSERT (qui est grande lui-même) de se produire.
Exécuter les opérations suivantes à partir d'une invite de commande mysql:
Assurez-vous que le grand assez. Pour plus d'informations sur cette option de configuration voir
MySQL max_allowed_packet
Cela a également des répercussions sur mysql_escape_string() et mysql_real_escape_string() en PHP limitation de la taille de la chaîne de création.
OriginalL'auteur Cody Caughlan
La meilleure réponse est d'utiliser une mise en œuvre qui est mieux et travaille également autour de cette question.
Vous pouvez lire un article ici. Magasin de 10 mo, 1000MB, n'a pas d'importance. La mise en œuvre des morceaux/découpe le fichier en plusieurs petits morceaux et les stocke dans plusieurs lignes.. Cela permet de charger et de récupération ainsi, la mémoire n'a pas également devenir un problème.
OriginalL'auteur DreamWerx
Certaines extensions PHP pour MySQL ont des problèmes avec LONGBLOB et LONGTEXT types de données. Les extensions peuvent pas en charge le blob streaming (l'envoi de la goutte un segment à la fois), ils ont donc de publier la totalité de l'objet en une seule fois.
Donc, si la limite mémoire de PHP ou de MySQL limite de taille de paquet de restreindre la taille d'un objet, vous pouvez poster à la base de données, vous devrez peut-être modifier la configuration sur PHP ou MySQL pour permettre cela.
Vous n'avez pas dit qui d'extension de PHP que vous utilisez (il y a au moins trois pour MySQL), et vous n'avez pas montrer le code que vous utilisez pour poster le blob dans la base de données.
OriginalL'auteur Bill Karwin
Vous pouvez utiliser MySQL Fonction LOAD_FILE pour stocker le fichier, mais vous avez encore d'obéir à la max_allowed_packet valeur et le fait que le fichier doit être sur le même serveur que l'instance MySQL.
OriginalL'auteur Ionuț G. Stan
Vous ne dites pas quelle est l'erreur que vous obtenez (utiliser
mysql_error()
pour le savoir), mais je soupçonne que vous avez peut-être frapper la taille de paquet maximale.Si c'est le cas, vous auriez besoin de changer votre configuration MySQL
max_allowed_packet
OriginalL'auteur Greg
Eh bien, j'ai le même problème. Et les données ne peuvent pas être saisies dans la base de données mysql chunck par chunck dans un "mode io"
Une solution semble pour créer une table avec une partie multi-gouttes comme
créer une table data_details
(
id pk int auto_increment,
chunck_number int not null,
dataPart blob
);
???
OriginalL'auteur manueldahmen