Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Получение двоичного кода файла
 
 автор: maximum7   (12.03.2010 в 20:37)   письмо автору
 
 

Добрый день,

Делаю загрузку видео напрямую на сервис youtube, согласно их руководству: http://code.google.com/intl/ru/apis/youtube/developers_guide_protocol.html#Direct_uploading

Добавление через обычную форму уже сделал и работает, но есть необходимость загружать файлы сразу на сервис. В описании указано, что нужно передавать Binary File Data видео файла.

То есть не ссылку на него? В таком случае, как мне получить двоичный код файла?

  Ответить  
 
 автор: sim5   (12.03.2010 в 20:57)   письмо автору
 
   для: maximum7   (12.03.2010 в 20:37)
 

Все файлы это бинарные данные, просто по FTP, например, можно их передавать в режиме текста или как бинарные данные.

  Ответить  
 
 автор: maximum7   (12.03.2010 в 21:09)   письмо автору
 
   для: sim5   (12.03.2010 в 20:57)
 

Тогда, подскажите, вот я передаю файл так:


$tempFile = $_FILES['video_file']['tmp_name'];
$targetPath = BASE_DIR . "/test/video/";
$targetFile =  $targetPath . $_FILES['video_file']['name'];
move_uploaded_file($tempFile,$targetFile);


$data = "<?xml version='1.0'?>
<entry xmlns='http://www.w3.org/2005/Atom'
xmlns:media='http://search.yahoo.com/mrss/'
xmlns:yt='http://gdata.youtube.com/schemas/2007'>
<media:group>
<media:title type='plain'>test</media:title>
<media:description type='plain'>test</media:description>
<media:category scheme='http://gdata.youtube.com/schemas/2007/categories.cat'>test</media:category>
<media:keywords>test</media:keywords>
</media:group>
</entry>";

$boundary = $this->boundary(); // случайное число

if ($fp = fsockopen ("gdata.youtube.com", 80, $errno, $errstr, 20))
{
$request ="POST /feeds/api/users/user/uploads HTTP/1.1\r\n";
$request.="Host: uploads.gdata.youtube.com\r\n";
$request .="Authorization: GoogleLogin auth=".$respons_key."\r\n";
$request.="X-GData-Client: ".$this->_source." \r\n";
$request.="X-GData-Key: key=".$this->_mykey." \r\n";
$request.="Slug: ".$_FILES['video_file']['name']." \r\n";
$request.="Content-Type: multipart/related; boundary=".$boundary."\r\n";
$request.="Content-Length: ".strlen($data)."\r\n";
$request.="Connection: close\r\n";

$request.="\r\n";
$request.=$boundary."\r\n";
$request.="Content-Type: application/atom+xml; charset=UTF-8\r\n";

$request.="\r\n";
$request.=$data."\r\n";
$request.=$boundary."\r\n";

$request.="\r\n";

$request.="Content-Type: video/*\r\n";
$request.="Content-Transfer-Encoding: binary\r\n";

$request.="\r\n";

$request.=$targetFile."\r\n";
$request.=$boundary;

socket_set_timeout($fp, 10);
fputs($fp,$request,strlen($request));
$response = fread($fp,3280);
fclose($fp);
}


но, получаю No file found in upload request., может не правильно сформирован запрос?

  Ответить  
 
 автор: sim5   (12.03.2010 в 21:20)   письмо автору
 
   для: maximum7   (12.03.2010 в 21:09)
 

Content-Transfer-Encoding: binary - это от куда такое почерптуно?
Не знаю как пердаются на youtube файлы, но вы хотя бы проверяете, что они к вам закачаны? Уж больно вы уверенно, без проверок...

  Ответить  
 
 автор: maximum7   (12.03.2010 в 21:22)   письмо автору
 
   для: sim5   (12.03.2010 в 21:20)
 

Из их примера, я в первом посте дал ссылку. Эта строка присутствует как в примере запроса, так и в результатах ответа.

я пока на локальном сервере тестирую, и файлы закачиваются. там всё нормально.

  Ответить  
 
 автор: sim5   (12.03.2010 в 21:26)   письмо автору
 
   для: maximum7   (12.03.2010 в 21:22)
 

MIME Content-Transfer-Encoding Header and Encoding Methods

MIME Encoding Methods

To send non-ASCII data in MIME, it is necessary that it be encoded. The Content-Transfer-Encoding header is used to specify how a MIME message or body part has been encoded, so that it can be decoded by its recipient. The following types of encoding are defined:

7bit: This indicates that the message is already in ASCII form compatible with RFC 822. It is the default and is what is assumed if no Content-Transfer-Encoding header is present.

8bit / binary: These synonymous values mean the message has been encoded directly in 8-bit binary form. Yes, I did just say that this would violate the rules of RFC 822. These options appear to have been included to support future mechanisms for transporting binary data directly. RFC 1652 describes an SMTP extension that discusses this in part: SMTP Service Extension for 8bit-MIMEtransport (sic, there is no space between “MIME” and “transport”). However, the standard is clear that this still does not allow the transfer of raw binary data using SMTP and RFC 822.

quoted-printable: This is a special encoding that is used when most of the data is ASCII text, but when it contains certain violations of the rules of RFC 822. These illegal sections are converted using special encoding rules so the data as a whole is consistent with RFC 822.

base64: An encoding used to allow arbitrary binary data to be represented in ASCII form. The data is then sent as ASCII and decoded back into binary form by the recipient.

The quoted-printable and base64 encodings are the most interesting ones, because they are what allow non-RFC-822 data to be sent using RFC 822.

-----

Вот с этим знаком, с вашим примером - впервые вижу такое.

  Ответить  
 
 автор: maximum7   (12.03.2010 в 21:32)   письмо автору
 
   для: sim5   (12.03.2010 в 21:26)
 

ну, я не сам это придумал. хотя, если убрать эту строчку, ничего не меняется...

  Ответить  
 
 автор: sim5   (12.03.2010 в 21:35)   письмо автору
 
   для: maximum7   (12.03.2010 в 21:32)
 

Читайте:
base64: An encoding used to allow arbitrary binary data to be represented in ASCII form.
Что там ребята на ютубе придумали, я не знаю.

  Ответить  
 
 автор: maximum7   (13.03.2010 в 12:35)   письмо автору
 
   для: sim5   (12.03.2010 в 21:35)
 

Заменил эту строчку на


$request.="Content-Transfer-Encoding: base64\r\n";


результат тот же.

  Ответить  
 
 автор: Trianon   (13.03.2010 в 12:45)   письмо автору
 
   для: maximum7   (13.03.2010 в 12:35)
 

Вас куда-то в сторону унесло.

Насколько я помню,
а) Совмещенное контент-транспортное кодирование есть в сообщениях, но ни как не в HTTP-запросах.
В запросах transfer-encoding и content-encoding разделены.

б) Транспортное кодирование вообще неприменимо к части тела запроса.

  Ответить  
 
 автор: maximum7   (13.03.2010 в 14:38)   письмо автору
 
   для: Trianon   (13.03.2010 в 12:45)
 

То есть должно быть только одно Content-Type: application/atom+xml; charset=UTF-8? Но, так всё равно нет никакого результата.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования