apache-flex - 通过 URLRequest 上传 Youtube?

标签 apache-flex actionscript-3 youtube-api

我正在尝试通过 YouTube api 上传视频。我可以很好地验证所有内容并很好地制定请求,但是请求正文与二进制视频数据我遇到了问题。

对文件数据进行编码并将其添加到 urlRequest 正文的正确方法是什么?

我最好的猜测是:

public function getFileStreamBytes(fileName:String):String{

var byteArray:ByteArray = new ByteArray();
var returnString:String = "";

var file:File = new File(fileName);
var fileStream:FileStream = new FileStream();
fileStream.open(file,FileMode.READ);
fileStream.position = 0;
fileStream.readBytes(byteArray);

byteArray.position = 0;
for(var i:Number = 0; byteArray.bytesAvailable > 0; i++){
    returnString += byteArray.readUTF();

}
return returnString;
}

这将返回 400 Bad Request 响应

最佳答案

我刚刚遇到了一个非常相似的问题,终于得到了答案(归功于stackoverflow用户deadrunk)。事实证明,如果您通过 URLRequest 发送二进制数据,则必须手动将其格式化为 POST 数据。看看这个代码:

//*** FORMAT POST DATA ***//
var myByteArray:ByteArray = new ByteArray; //Data to be uploaded
var myData:ByteArray = new ByteArray;
var myBoundary:String = "";
var stringData:String;
var i:uint;

for (i = 0; i < 0x20; ++i ) myBoundary += String.fromCharCode(uint(97+Math.random()*25));
myData.writeShort(0x2d2d); //--
myData.writeUTFBytes(myBoundary);
myData.writeShort(0x0d0a); //\r\n
stringData = 'Content-Disposition: form-data; name="fieldName"; filename="filename.txt"';
for (i = 0; i < stringData.length; i++) myData.writeByte(stringData.charCodeAt(i));
myData.writeShort(0x0d0a); //\r\n
stringData = 'Content-Type: application/octet-stream'; //Change me!
myData.writeShort(0x0d0a); //\r\n
myData.writeShort(0x0d0a); //\r\n
for (i = 0; i < stringData.length; i++) myData.writeByte(stringData.charCodeAt(i));
myData.writeBytes(myByteArray, 0, myByteArray.length );
myData.writeShort(0x0d0a); //\r\n
myData.writeShort(0x2d2d); //--
myData.writeUTFBytes(myBoundary);
myData.writeShort(0x2d2d); //--

//*** SEND REQUEST ***//
var uploadRequest:URLRequest = new URLRequest("http://127.0.0.1/upload.php");
uploadRequest.method = URLRequestMethod.POST;
uploadRequest.contentType = 'multipart/form-data; boundary=' + myBoundary;
uploadRequest.data = myData
uploadRequest.requestHeaders.push( new URLRequestHeader( 'Cache-Control', 'no-cache' ) );

var uploader:URLLoader = new URLLoader;
uploader.dataFormat = URLLoaderDataFormat.BINARY;
uploader.load(uploadRequest);

基本上,您向内容类型添加一个“;boundary=[boundary string]”参数,然后将您的请求格式化为:
--[boundary string]
Content-Disposition: form-data; name="[name of the form field]"; filename="[filename you want the server to see]"
Content-Type: [ideally your data's actual content type]

[your binary data]
--[boundary string]--

我希望这有帮助!

关于apache-flex - 通过 URLRequest 上传 Youtube?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6333956/

相关文章:

youtube-api - 如何从 YouTube 中删除 "More videos"功能

apache-flex - Flex - new ClassFactory() 与完全限定名称

apache-flex - 在 flex 应用程序中使用 mxml 比 actionscript 有什么优势?

xml - 基于 XML 或数据库结构的 Flex 代码生成器

php - AS3、PHP、mysql : Cant get variables from server

ios - cacheAsBitmap 对 AIR for iOS 中使用 scrollRect mask 的 Sprite 没有影响

ios - Flash builder 在发布版本中包含文件

javascript - swfobject.embedSWF 在 iOS 中不工作

php - 获取用户信息 Google-PHP-Client 问题?

flash - As2和flex sdk