php - 将文件保存为数据库中的 blob ajax php pdo

标签 php mysql ajax pdo blob

$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();
}

这就是我在 php 中将文件作为 blob 插入的方式。它正在保存文件,但未正确保存。当我说它没有正确保存时,我的意思是一路上出了点问题。当我比较使用我的项目保存文件和在 XAMPP 中手动添加文件时,fileblob 存在差异,例如我在 xampp 中手动保存文件,fileblob 是 [BLOB - 488.9 KiB]当我使用该项目时变成 [BLOB - 479.2 KiB] 。我认为这就是当我尝试显示数据库中的文件时它显示空白页面的原因(当我显示的文件是我使用项目插入的文件时),但如果我尝试显示的文件是我在 xampp 中手动插入的文件它正在显示该文件。

我的插入可能出了什么问题?为什么我没有保存正确的 blob

UPDATE

<input type="file" id="filecontent" name="filecontent" multiple="">

ajax

    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

table

table

最佳答案

根据PHP/PDO/MySQL: inserting into MEDIUMBLOB stores bad data ,尝试使用以下行来构造您的 PDO 对象:

$dbh = new PDO($dsn, $username, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES latin1 COLLATE latin1_general_ci"));

说明

正如 Ben M 在相关问题中指出的那样,我认为这里有两个糟糕的设计决策。

有一个连接字符集的概念。这个想法是 SQL 文本可以采用任何字符集,然后在 SQL 服务器检索时进行转换。

这对于二进制数据不太适用,因为它不是文本,因此根据定义,不能采用任何字符集,但仍然使用字符串文字进行传输

可以通过在传输过程中引用 BLOB 数据(使用 BASE64_* 函数或 hex-escaping )来解决此问题,事实上,这就是许多人正在做的事情。

第二个设计决策是在 PDO/PHP 中:PDO 不执行任何字符集转换(它不能,因为 PHP 中的字符串本质上与字符集无关),因此 PHP 是唯一(或少数几种语言之一) SQL 传输字符集的选择实际上很重要,因为它需要与输入字符串实际采用的编码相匹配。

在其他语言中,传输字符集只需具有足够的表达能力即可包含字符串中可能使用的任何字符。在当今的表情符号世界中,这很可能只能由 unicode 字符集(utf-8 等)来保证。然而,这些都不是二进制安全的(因为并非所有可能的字节组合都会产生有效的字符串),因此即使我们可以解决 PHP 问题,我们仍然会遇到问题# 1.

在理想的情况下,SQL 命令在传输过程中始终采用 ASCII 字符集,并且每个字符串值都会有一个字符集参数,其中“二进制”可能是随其提供的可能值。 MySQL 实际上有这样一个字符串构造,它称之为“引入器”。然而,“_binary”似乎不是一个有效的值。

然后,另一端将使用此字符集信息将字符串值转换为其 native 字符集(用于客户端到服务器传输的列或用于服务器到客户端传输的编程语言的字符串字符集)。

这样,BLOB 值中唯一需要转义的就是字符串分隔符("')。

关于php - 将文件保存为数据库中的 blob ajax php pdo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29622293/

相关文章:

php - Python 扭曲渲染 PHP

mysql - Rails - 带分组的最大版本

php - 使用ajax和PHP上传图像

php - 动画在登录时运行一次 - jQuery

php - 在 cakephp 中打开/关闭特定 Controller 的 Debug模式

php - 为什么 MVC 范式最适合 Web 应用程序?

mysql - Lumen/Laravel 5.1 - 调用存储过程似乎提交事务

mysql - 如何对非常大的数据集的结果集进行分组、存储和过滤

jquery - 如果 ajax 花费的时间少于 X 秒,如何延迟显示进度?

php - 如何在不使用 PHP 目录的情况下创建 URL 路径?