Wie kann ich einfügen große Dateien in MySQL db PHP?
-
20-08-2019 - |
Frage
Ich möchte eine große Datei mit maximaler Größe 10 MB auf meine MySQL-Datenbank hochzuladen. Mit .htaccess
änderte ich eigenes Datei-Upload-Limit von PHP auf „10485760“ = 10 MB. Ich bin in der Lage Dateien ohne Probleme bis zu 10 MB hochladen.
Aber ich kann die Datei nicht in der Datenbank einfügen, wenn es mehr als 1 MB groß ist.
Ich bin mit file_get_contents
alle Dateidaten zu lesen und es an die INSERT-Abfrage übergibt als eine Zeichenfolge in ein LONGBLOB Feld eingefügt werden.
Aber Dateien größer als 1 MB sind nicht in die Datenbank aufgenommen, obwohl ich print_r($_FILES)
sicherstellen kann, dass die Datei korrekt hochgeladen. Jede Hilfe wird geschätzt, und ich muss sie innerhalb der nächsten 6 Stunden. Also, bitte helfen Sie!
Lösung
Soweit ich weiß, es ist in der Regel schneller und besser Praxis nicht auf die Datei in der DB zu speichern, da es sehr schnell massiv bekommen und verlangsamen. Am besten ist es, einen Weg zu speichern Sie die Datei in einem Verzeichnis zu machen und dann speichern Sie einfach den Speicherort der Datei in der db.
Wir tun es für Bilder / pdfs / mpegs etc im CMS wir, indem Sie einen Ordner für die Datei aus der URL-safe Dateinamen und speichert den Namen des Ordners in der db Namen bei der Arbeit haben. Es ist nur einfach, dann die URL in der Präsentationsschicht zu schreiben.
Andere Tipps
Sie wollen den MySQL-Konfigurationswert „max_allowed_packet“ überprüfen, die zu klein eingestellt werden könnten, verhindern, dass die INSERT (die großen selbst ist) nicht passiert.
Führen Sie die folgenden von einer MySQL-Eingabeaufforderung ein:
mysql> show variables like 'max_allowed_packet';
Stellen Sie sicher, seine groß genug. Weitere Informationen zu dieser Konfigurationsoption finden Sie unter
Dies hat auch Auswirkungen mysql_escape_string () und mysql_real_escape_string () in PHP, um die Größe der Zeichenfolge Schöpfung zu begrenzen.
Die beste Antwort ist eine Implementierung zu verwenden, die besser ist und funktioniert auch um dieses Thema. Sie können einen Artikel hier . Shop 10 MB, 1000 MB, keine Rolle spielt. Die Implementierung Stücke / schneidet die Datei in viele kleinere Stücke und speichert sie in mehreren Reihen .. Dies hilft bei der Last und Holen der so funktioniert Speicher nicht auch ein Problem werden.
Einige PHP-Erweiterungen für MySQL haben Probleme mit LONGBLOB und LONGDatenTypen. Die Verlängerungen können nicht blob-Streaming (Posting das Blob ein Segment zu einem Zeitpunkt) unterstützen, so dass sie das gesamte Objekt auf einmal zu schreiben.
Also, wenn PHP-Speicherlimit oder MySQL-Paketgröße Grenze die Größe eines Objekts beschränken Sie auf die Datenbank schreiben können, können Sie entweder PHP oder MySQL dies zu ermöglichen, müssen einige Einstellungen ändern.
Sie habe nicht gesagt, welche PHP-Erweiterung, die Sie verwenden (mindestens drei für MySQL sind), und Sie zeigte keine der Code verwenden Sie das Blob in die Datenbank zu schreiben.
könnten Sie verwenden MySQL LOAD_FILE Funktion um die Datei speichern, aber Sie immer noch den max_allowed_packet Wert und die Tatsache, dass die Datei auf dem gleichen Server wie die MySQL-Instanz sein muss.
gehorchen müssen Sie sagen nicht, was Fehler Sie bekommen (Verwendung mysql_error()
erfahren), aber ich vermute, Sie sein kann, die maximale Paketgröße zu treffen.
Wenn dies der Fall ist, dann würden Sie brauchen, um Konfiguration MySQL ändern max_allowed_packet
Sie sagen nicht, welche Fehler Sie bekommen (Verwendung mysql_error (), um herauszufinden), aber ich vermute, Sie können die maximale Paketgröße schlagen werden.
Wenn dies der Fall ist, dann würden Sie Ihre MySQL-Konfiguration max_allowed_packet ändern müssen
Nun, ich habe das gleiche Problem. Und die Daten können nicht in der MySQL-Datenbank chunck von chunck in einem „io-Modus“
eingegeben werdenloop for :
read $data from file,
write $data to blob
end loop
close file
close blob
Eine Lösung scheint eine Tabelle mit mehrteiligen Blobs zu erstellen wie create table data_details ( id int pk auto_increment, chunck_number int nicht null, dataPart blob ); ???