$fileCount = count($_FILES); for ($i = 0; $i < $fileCount; $i++) { $fp = fopen($_FILES["file_".$i]['tmp_name'], 'rb'); $stmt4 = $dbh - > prepare("INSERT INTO files_tbl (pin,remarks,fileblob,file_type,nameoffile,filesize) VALUES (?,?,?,?,?,?)"); $stmt4 - > bindValue(1, $pin, PDO::PARAM_STR); $stmt4 - > bindValue(2, $remarks, PDO::PARAM_STR); $stmt4 - > bindParam(3, $fp, PDO::PARAM_LOB); $stmt4 - > bindParam(4, $_FILES["file_".$i]['type'], PDO::PARAM_STR); $stmt4 - > bindValue(5, $_FILES["file_".$i]['name'], PDO::PARAM_STR); $stmt4 - > bindValue(6, $_FILES["file_".$i]['size'], PDO::PARAM_STR); $stmt4 - > execute(); }
Вот как я вставляю файл как blob в php. Он сохраняет файл, но он не сохраняется должным образом. Когда я говорю, что это не экономит должным образом, я имею в виду, что на этом пути что-то не так. Когда я сравниваю сохранение файла с помощью моего проекта и вручную добавляю файл в XAMPP, есть разница в файловом блоке, например, я сохраняю файл вручную в xampp, файл fileblob [BLOB - 488.9 KiB]
когда я использую проект, становится [BLOB - 479.2 KiB]
. Я думаю, что это причина, когда я пытаюсь показать файл из базы данных, он показывает пустую страницу (когда файл, который я показываю, является файлом, который я вставляю, используя проект), но если файл, который я пытаюсь показать, – это файл, который я вставляю вручную в xampp он показывает файл.
Что может быть неправильным в моей вставке? Почему я не сохраняю правильную blob
UPDATE
<input type="file" id="filecontent" name="filecontent" multiple="">
Аякса
var file = $('#filecontent')[0].files; for (var i = 0; i < file.length; i++) { formData.append("file_" + i, file[i]); //more data are passed to formData //formData.append("file", file[i]); console.log(file[i]); } $.ajax({ url: '../include/AddNew.php', type: 'POST', dataType: "json", data: formData, processData: false, // tell jQuery not to process the data contentType: false, // tell jQuery not to set contentType success: function(data) { console.log(data); alert(data.message); //window.location.reload(true); }, error: function(data) { //alert("Error!"); // Optional } });
UPDATE
когда я попытался поместить print_r($_FILES);
перед линией for ($i = 0; $i < $fileCount; $i++) {
вывод
Array ( [file_0] => Array ( [name] => whomovedmycheese - Copy.pdf [type] => application/pdf [tmp_name] => C:\Users\HogRider\xampp\tmp\phpE775.tmp [error] => 0 [size] => 500624 ) [file_1] => Array ( [name] => whomovedmycheese.pdf [type] => application/pdf [tmp_name] => C:\Users\HogRider\xampp\tmp\phpE786.tmp [error] => 0 [size] => 500624 ) )
UPDATE
Согласно PHP / PDO / MySQL: вставка в MEDIUMBLOB хранит плохие данные , попробуйте использовать следующую строку для создания объекта PDO:
$dbh = new PDO($dsn, $username, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES latin1 COLLATE latin1_general_ci"));
объяснение
Я думаю, что есть, как отмечает Бен М в связанном вопросе, два плохих дизайнерских решения здесь работают.
Существует концепция кодировки соединения. Идея состоит в том, что текст SQL может быть в любой кодировке и затем преобразован при извлечении SQL-сервером.
Это не так хорошо работает с двоичными данными, поскольку это не текст и, следовательно, не должно, по определению, быть в любой кодировке, но все равно передается с использованием строковых литералов .
Эта проблема может быть решена путем цитирования данных BLOB во время передачи (либо с использованием функций BASE64_ *, либо с помощью hex-экранирования ), и, действительно, это то, что делают многие люди.
Второе дизайнерское решение в PDO / PHP: PDO не делает никакого преобразования charset (он не может, потому что строки в PHP по своей сути являются атрибутами), поэтому PHP является единственным (или одним из немногих языков), на котором выбор кодировка передачи SQL фактически важна, потому что она должна соответствовать кодировке, в которой находятся входные строки.
На других языках кодировка передачи должна быть достаточно выразительной, чтобы охватить любые символы, которые могут использоваться в строках. В сегодняшнем мире emojis это, скорее всего, гарантируется только кодировками Unicode (utf-8 и т. П.). Тем не менее, ни один из них не является двоично-безопасным (поскольку не всякая возможная комбинация байтов дает допустимую строку), поэтому, даже если мы могли бы обойти проблему PHP, нам все равно осталась бы проблема №1.
В идеальном мире команды SQL всегда будут в кодировке ASCII во время передачи, и каждое строковое значение будет иметь аргумент charset, из которого «двоичный» может быть возможным значением, поставляемым вместе с ним. MySQL фактически имеет такую конструкцию для строк, которую он называет «интродуктором». «_binary», однако, похоже, не является допустимым значением.
Затем эта информация о кодировке будет использоваться другим концом для преобразования строкового значения в его собственную кодировку (либо для переноса столбца для передачи между серверами, либо для строковой кодировки языка программирования для передачи от сервера к клиенту).
Таким образом, единственное, что должно было бы быть экранировано в значениях BLOB, было бы ограничителем строк ( "
или '
).
Можешь попробовать
MySQL
CREATE TABLE files ( id INT AUTO_INCREMENT PRIMARY KEY, mime VARCHAR (255) NOT NULL, data BLOB NOT NULL );
PHP
class BlobDemo { const DB_HOST = 'localhost'; const DB_NAME = 'nameofdb'; const DB_USER = 'username'; const DB_PASSWORD = 'password'; /** * PDO instance * @var PDO */ private $pdo = null; /** * Open the database connection */ public function __construct() { // open database connection $conStr = sprintf("mysql:host=%s;dbname=%s;charset=utf8", self::DB_HOST, self::DB_NAME); try { $this->pdo = new PDO($conStr, self::DB_USER, self::DB_PASSWORD); //for prior PHP 5.3.6 //$conn->exec("set names utf8"); } catch (PDOException $e) { echo $e->getMessage(); } } /** * insert blob into the files table * @param string $filePath * @param string $mime mimetype * @return bool */ public function insertBlob($filePath, $mime) { $blob = fopen($filePath, 'rb'); $sql = "INSERT INTO files(mime,data) VALUES(:mime,:data)"; $stmt = $this->pdo->prepare($sql); $stmt->bindParam(':mime', $mime); $stmt->bindParam(':data', $blob, PDO::PARAM_LOB); return $stmt->execute(); } } $blobObj = new BlobDemo(); // test insert pdf $blobObj->insertBlob('pdf/prova.pdf',"application/pdf");
работа для меня, я пытаюсь с PDF, JPG и HTML для вставки обновления и просмотра.