gpt4 book ai didi

php - 是否将Video Blob存储到数据库中?

转载 作者:行者123 更新时间:2023-11-28 02:09:30 25 4
gpt4 key购买 nike

是的,在您对我开玩笑之前,这是出于测试目的,是的,我的确知道这不是一个好主意,但我只是对其进行测试。 (学习新事物)

立即确定录制视频后,使用jQuery.post将其发送到uploadvideo.php,但是如何在该页面上检索呢?还是我们可以将其直接存储到数据库中?从一页而不是发送?

function postVideoToServer(videoblob) {

var data = {};
data.video = videoblob;
data.metadata = 'test metadata';
data.action = "upload_video";
jQuery.post("http://mysite.com/uploadvideo.php", data, onUploadSuccess);
}


在uploadvideo.php上我有这个

<?php

require("connect.php");

$video = $_POST["video"];
$up = mysql_query("INSERT INTO video VALUES ('$video')");

?>


但这似乎没有用,任何帮助都会很大。

最佳答案

您不会在将数据插入查询之前转义数据,因此您有一个SQL注入漏洞。像视频这样的二进制文件往往可以使这一点变得很清楚:它们将包含通常在SQL语句中禁止使用的字符,并且他们对此并不感到羞耻。

为了解决这个问题,我们将做两件事:


使用BLOB(二进制大对象)列类型(如果尚未这样做)。
使用准备好的语句(以防止SQL注入)。


让我们首先尝试从磁盘插入一个二进制文件。我们将PDO用于数据库,因为它使准备好的语句变得容易。首先,我们需要准备一下语句:

// assuming PDO object in $db
$stmt = $db->prepare("insert into videos values (:video);");


我们使用的是 $,而不是让PHP使用 :插入变量的值。 PHP字符串中的 :没有任何特殊含义,但是对于SQL来说,它是一个占位符。现在,我们可以告诉PDO我们想在其中输入什么值,而数据库将获取它并知道它是一个值,而无需尝试将其解释为SQL。您可以以相当简单的方式将整数,字符串和其他类型的对象放入其中,但是有趣的是,我们正在处理大型二进制文件。与仅传递值的其他类型的值不同,PDO在这里需要一个文件句柄,因此它不必一次将所有数据存储在内存中。让我们打开一个文件并绑定该值:

$file = fopen("video.mp4", "rb");
$stmt->bindValue("video", $video, PDO::PARAM_LOB); // LOB = Large OBject


现在我们已经填写了所有占位符,我们可以执行以下语句:

$stmt->execute();


语句执行后,我们可以关闭文件,因为我们不再使用它:

fclose($file);




因此,这就是从磁盘将BLOB插入数据库的方式,但这并没有回答您的问题,而是从 POST请求中获取问题。

让我们考虑一个稍微传统的示例,没有任何花哨的AJAX。假设我们有一个普通的 form元素和一个普通的 input元素,且 typefile。文件提交被写入临时文件。然后将文件名存储到 $_FILES中的适当位置。将该临时文件 can then be moved放到更方便的位置,或者我们可以对其进行处理。

由于数据已写入临时文件,因此仍然是文件,我们可以将其插入,只是打开另一个文件即可:

$file = fopen($_FILES["video"]["tmp_name"], "rb");




知道也很高兴,但是仍然不能回答您的问题。真正的方法是什么?

好吧,这很棘手。您的数据来自JavaScript,其中字符串代表Unicode文本,而不是二进制数据。如果您尝试通过电线发送超过127个代码点,它将以某种方式进行编码,不会真正破坏您的数据,而是会以一种意外的方式(尽管是可逆的)对其进行更改。

较新的浏览器提供 BlobUint8Array对象,使JavaScript可以处理二进制数据,并修改 XMLHttpRequest并添加 FormData也可以处理二进制数据。

那么在JavaScript方面该做什么呢?

我假设您想像以前一样使用标准的 file输入,但是让它上载而不刷新页面。当然,还有其他方法可以实现,但它们超出了范围。使用您选择的搜索引擎搜索XMLHttpRequest 2。


获取 File。 HTML5将 files属性添加到 file输入中,使您可以访问当前选定的文件。由于我们可能不处理多文件 file输入(另一个HTML5附加功能),因此我们只得到第零个项目:

var file = document.getElementById('video').files[0];

制作一个 FormData并用您的数据填充它。如前所述, FormData是最近才添加的,只有较新的浏览器支持它。但是,对于支持它的浏览器,它使您的生活变得很轻松:

var data = new FormData();
data.append('video', file);

提出要求。除了将 XMLHttpRequest传递给 send而不是字符串之外,我们可以以传统方式使用 FormData

var xhr = new XMLHttpRequest();
xhr.open("POST", "upload_video.php", true);
xhr.send(data);



您的视频现在正在上传!等一下我们在PHP方面做什么?事实证明,以这种方式对服务器显示的方式与使用无AJAX的纯格式时的显示方式相同。那就对了;无需修改。这样很好,是吧?

现在,由于服务器端接口是相同的,因此我相信您可以使禁用JavaScript的人可以访问它。并不难;就像在第二阶段中一样,只需添加带有普通 file元素的普通表单即可。



我们在这里介绍了一些内容,以便重申我们使用的主要技术:


我们使用 BLOB列来保存二进制数据。
我们使用 PDO与数据库进行通信并使用准备好的查询。
我们将文件作为大对象参数绑定到准备好的查询。
我们使用上传的文件作为要上传的文件。
我们使用HTML5功能和 XMLHttpRequest 2接口使用AJAX发送二进制数据。

关于php - 是否将Video Blob存储到数据库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17310880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com