将Video Blob存储到数据库中?

时间:2013-06-26 03:07:38

标签: php javascript

好的,在你离开我之前这是出于测试目的而且我知道这不是一个好主意,但我只是在测试它。 (学习新事物)

现在确定录制视频后,使用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')");

?>

但似乎没有任何帮助会很好。

1 个答案:

答案 0 :(得分:1)

在将数据插入查询之前,您没有转义数据,因此您有一个SQL注入漏洞。像视频这样的二进制文件往往会非常清楚:它们将包含通常在SQL语句中被禁止的字符,而且它们并不以此为耻。

要解决这个问题,我们会做两件事:

  1. 使用BLOB(二进制大对象)列类型(如果您还没有这样做)。
  2. 使用预准备语句(以防止SQL注入)。
  3. 让我们从尝试从磁盘插入二进制文件开始。我们将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 type file的普通$file = fopen($_FILES["video"]["tmp_name"], "rb"); 元素。文件提交被写入临时文件。然后将文件名存储在$_FILES中的适当位置。这个临时文件can then be moved更方便我们可以用它做点什么。

    由于数据被写入临时文件,但它仍然是一个文件,除了打开另一个文件外,我们可以插入相同的文件:

    Blob

    这也很有用,但仍然没有回答你的问题。什么是真正的方式呢?

    嗯......那太棘手了。您的数据来自JavaScript,其中字符串表示Unicode文本,而不是二进制数据。如果您尝试通过网络发送超过127的任何代码点,它将以某种方式进行编码,而不是损坏您的数据,而是以意外(但可逆)方式更改它。

    较新的浏览器提供Uint8ArrayXMLHttpRequest个对象,以便JavaScript 可以处理二进制数据,并修改FormData并添加file所以它也可以处理二进制数据。

    那么在JavaScript方面要做什么?

    我假设您要像以前一样使用标准File输入,但要在不刷新页面的情况下上传。当然还有其他方法,但它们超出了范围。使用您选择的搜索引擎搜索 XMLHttpRequest 2

    1. 获取files HTML5将file属性添加到file输入,以便您访问当前选定的文件[s]。由于我们可能没有处理多文件var file = document.getElementById('video').files[0]; 输入(另一个HTML5添加),我们只会得到第0项:

      FormData
    2. 制作一个FormData并将其填入您的数据。如前所述,var data = new FormData(); data.append('video', file); 是最新添加的,只有较新的浏览器支持它。但是对于支持它的浏览器来说,它会让你的生活变得相当简单:

      XMLHttpRequest
    3. 执行请求。我们可以使用传统方式使用send,除了FormData var xhr = new XMLHttpRequest(); xhr.open("POST", "upload_video.php", true); xhr.send(data); 而不是字符串:

      file
    4. 您的视频现已上传!等等,什么?我们在PHP方面做了什么?事实证明,这样做对于服务器来说就像它使用没有AJAX 的普通表单一样。那是对的;不需要修改。当它像那样工作时很好,是吗?

      现在,由于服务器端接口完全相同,我相信您可以禁用禁用JavaScript的人员访问它们。它并不那么难;只需添加一个普通BLOB元素的普通表单,就像在第二阶段一样。


      我们已经在这里讨论了一些事情,所以只是重申我们使用的主要技术和技术:

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