|
|
|
| Добрый день,
Делаю загрузку видео напрямую на сервис youtube, согласно их руководству: http://code.google.com/intl/ru/apis/youtube/developers_guide_protocol.html#Direct_uploading
Добавление через обычную форму уже сделал и работает, но есть необходимость загружать файлы сразу на сервис. В описании указано, что нужно передавать Binary File Data видео файла.
То есть не ссылку на него? В таком случае, как мне получить двоичный код файла? | |
|
|
|
|
|
|
|
для: maximum7
(12.03.2010 в 20:37)
| | Все файлы это бинарные данные, просто по FTP, например, можно их передавать в режиме текста или как бинарные данные. | |
|
|
|
|
|
|
|
для: 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., может не правильно сформирован запрос? | |
|
|
|
|
|
|
|
для: maximum7
(12.03.2010 в 21:09)
| | Content-Transfer-Encoding: binary - это от куда такое почерптуно?
Не знаю как пердаются на youtube файлы, но вы хотя бы проверяете, что они к вам закачаны? Уж больно вы уверенно, без проверок... | |
|
|
|
|
|
|
|
для: sim5
(12.03.2010 в 21:20)
| | Из их примера, я в первом посте дал ссылку. Эта строка присутствует как в примере запроса, так и в результатах ответа.
я пока на локальном сервере тестирую, и файлы закачиваются. там всё нормально. | |
|
|
|
|
|
|
|
для: 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.
-----
Вот с этим знаком, с вашим примером - впервые вижу такое. | |
|
|
|
|
|
|
|
для: sim5
(12.03.2010 в 21:26)
| | ну, я не сам это придумал. хотя, если убрать эту строчку, ничего не меняется... | |
|
|
|
|
|
|
|
для: maximum7
(12.03.2010 в 21:32)
| | Читайте:
base64: An encoding used to allow arbitrary binary data to be represented in ASCII form.
Что там ребята на ютубе придумали, я не знаю. | |
|
|
|
|
|
|
|
для: sim5
(12.03.2010 в 21:35)
| | Заменил эту строчку на
$request.="Content-Transfer-Encoding: base64\r\n";
|
результат тот же. | |
|
|
|
|
|
|
|
для: maximum7
(13.03.2010 в 12:35)
| | Вас куда-то в сторону унесло.
Насколько я помню,
а) Совмещенное контент-транспортное кодирование есть в сообщениях, но ни как не в HTTP-запросах.
В запросах transfer-encoding и content-encoding разделены.
б) Транспортное кодирование вообще неприменимо к части тела запроса. | |
|
|
|
|
|
|
|
для: Trianon
(13.03.2010 в 12:45)
| | То есть должно быть только одно Content-Type: application/atom+xml; charset=UTF-8? Но, так всё равно нет никакого результата. | |
|
|
|