2013-06-26 3 views
1

ОК, прежде чем вы идете на меня, это для целей тестирования, и ДА, я знаю, что это не очень хорошая идея, но я просто ее проверяю. (Изучение НОВЫХ вещей)Сохранение Video Blob в базе данных?

OK Теперь, когда видеозапись записана, он использует 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

JavaScript! = Java – Jeffrey

+0

просто сохраните ссылку на видео, а не бинарный –

+1

@Arun: Как это будет работать? Если кто-то, скажем, берет видео с видеокамерой, помещает его на свой компьютер и хочет загрузить его на ваш веб-сайт, у него нет URL-адреса. Если у него нет URL-адреса, как вы ожидаете «просто сохранить ссылку на него»? – icktoofay

ответ

1

Вы не избегаете данных, прежде чем вставлять их в запрос, поэтому у вас есть уязвимость в SQL-инъекции. Бинарные файлы, такие как видео, как правило, делают это совершенно ясным: они собираются содержать символы, которые обычно запрещаются в операторах SQL, и они не стыдятся этого факта.

Чтобы исправить это, мы будем делать две вещи:

  1. Использовать BLOB (Binary Large Object) Тип столбца (если вы не сделали этого).
  2. Используйте подготовленный оператор (для защиты от 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); 

Так вот как вставить двоичные объекты в базу данных с диска, б ut, который не ответил на ваш вопрос, где вы получаете его от запроса POST.

Рассмотрим несколько более традиционный пример, без каких-либо причудливых AJAX. Предположим, у нас был простой старый элемент form с простым старым элементом input с typefile. Записи файлов записываются во временный файл.Затем имя файла сохраняется в соответствующем месте в $_FILES. Этот временный файл can then be moved где-то более удобным или мы могли что-то с этим сделать.

Поскольку данные записываются во временный файл, он по-прежнему файл, тем не менее, и мы можем вставить его точно так же, за исключением того, только открытие другого файла:

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

Это хорошо знать тоже, но все еще не отвечает на ваш вопрос. Что такое real способ сделать это?

Well & hellip; это сложно. Ваши данные поступают из JavaScript, где строки представляют текст Unicode, а не двоичные данные. Если вы попытаетесь отправить любую кодовую точку над 127 по проводам, она будет каким-то образом закодирована, а не , искажая ваши данные, но изменяя их неожиданным (хотя и обратимым) способом.

Новые браузеры обеспечивают Blob и Uint8Array объекты, которые делают его таким JavaScript может обрабатывать двоичные данные, а также изменять XMLHttpRequest и добавить FormData поэтому он тоже может обрабатывать двоичные данные.

Так что же делать со стороны JavaScript?

Предполагается, что вы хотите использовать стандартный вход file, как и раньше, но пусть он загружается без обновления страницы. Конечно, есть и другие способы сделать это, но они не входят в сферу действия. Используйте поисковый механизм, чтобы выбрать XMLHttpRequest 2.

  1. Получить File. HTML5 добавляет свойство files к входам file, позволяя вам получить доступ к текущему выбранному файлу [s]. Поскольку мы, вероятно, имеем дело не с несколькими файл file входов (другой HTML5 сложение), мы просто получаем нулевую позицию:

    var file = document.getElementById('video').files[0]; 
    
  2. Сделать FormData и заполнить его с вашими данными. Как уже упоминалось ранее, FormData - довольно недавнее дополнение, и только новые браузеры поддерживают его. Для браузеров, которые поддерживают его, хотя, это делает вашу жизнь довольно легко:

    var data = new FormData(); 
    data.append('video', file); 
    
  3. ли запрос. Мы можем использовать 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.