好的,在你离开我之前这是出于测试目的而且我知道这不是一个好主意,但我只是在测试它。 (学习新事物)
现在确定录制视频后,使用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')");
?>
但似乎没有任何帮助会很好。
答案 0 :(得分:1)
在将数据插入查询之前,您没有转义数据,因此您有一个SQL注入漏洞。像视频这样的二进制文件往往会非常清楚:它们将包含通常在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
type
file
的普通$file = fopen($_FILES["video"]["tmp_name"], "rb");
元素。文件提交被写入临时文件。然后将文件名存储在$_FILES
中的适当位置。这个临时文件can then be moved更方便或我们可以用它做点什么。
由于数据被写入临时文件,但它仍然是一个文件,除了打开另一个文件外,我们可以插入相同的文件:
Blob
这也很有用,但仍然没有回答你的问题。什么是真正的方式呢?
嗯......那太棘手了。您的数据来自JavaScript,其中字符串表示Unicode文本,而不是二进制数据。如果您尝试通过网络发送超过127的任何代码点,它将以某种方式进行编码,而不是损坏您的数据,而是以意外(但可逆)方式更改它。
较新的浏览器提供Uint8Array
和XMLHttpRequest
个对象,以便JavaScript 可以处理二进制数据,并修改FormData
并添加file
所以它也可以处理二进制数据。
那么在JavaScript方面要做什么?
我假设您要像以前一样使用标准File
输入,但要在不刷新页面的情况下上传。当然还有其他方法,但它们超出了范围。使用您选择的搜索引擎搜索 XMLHttpRequest 2 。
获取files
。 HTML5将file
属性添加到file
输入,以便您访问当前选定的文件[s]。由于我们可能没有处理多文件var file = document.getElementById('video').files[0];
输入(另一个HTML5添加),我们只会得到第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);
而不是字符串:
file
您的视频现已上传!等等,什么?我们在PHP方面做了什么?事实证明,这样做对于服务器来说就像它使用没有AJAX 的普通表单一样。那是对的;不需要修改。当它像那样工作时很好,是吗?
现在,由于服务器端接口完全相同,我相信您可以禁用禁用JavaScript的人员访问它们。它并不那么难;只需添加一个普通BLOB
元素的普通表单,就像在第二阶段一样。
我们已经在这里讨论了一些事情,所以只是重申我们使用的主要技术和技术:
XMLHttpRequest
列来保存二进制数据。