AIR、URLRequest 和上传视频文件到 NodeJS 服务器
AIR, URLRequest and uploading video file to NodeJS server
我在本地主机上设置了一个 NodeJS 服务器(用于测试),我正在使用它对上传的视频文件进行 运行 FFMPEG。这是我要上传到的实际节点应用程序。
https://github.com/madebyhiro/codem-transcode
如果我 运行 在 OSX 控制台中使用
sudo curl -d '{"source_file": "MASTER.flv","destination_file":"converted.mp4","encoder_options": "-vcodec libx264 -vb 416k -s 320x180 -y -threads 0"}' http://localhost:8080/jobs
所以我知道节点服务器 运行ning 正常。
您可以看到特定的 JSON object 是 HTTP POST 请求的一部分。 (在我下面的 AIR 客户端代码示例中,这是我故意留空的 params Object。)
在客户端,我使用 AIR 桌面应用程序来简单地上传视频文件。
很多问题
主要问题就是不能上传文件到
同一台机器到本地服务器?
我的 requestHeaders 中是否遗漏了什么?
- 我应该使用 contentType = "multipart/form-data" 还是其他一些 contentType?
- contentType 是否应该像我在实际 UrlRequest Object 上所做的那样成为 headers 的一部分或定义为 属性?
- 我应该使用 UrlLoader.load 而不是 File.upload 吗?
- file.url 格式是否正确(假设我的 str 值正确)?
- 下面我的 uploadFile 代码方法还有其他错误或遗漏吗?
我正在奖励大量赏金,但前提是 所有 以上问题已 准确 回答,优先给出带有参考或代码示例的答案。这是另一个包含一些有用信息的相关问题 POST file upload using URLRequest
这里是相关的上传代码。 str 是我正在上传的实际视频文件的 nativePath。如前所述,JSON params Object 有意留空,因此需要适当的格式才能正常工作。
function uploadFile(str:String):void {
var params:Object={}
var jsonOb:String = JSON.stringify(params);
var hdr:URLRequestHeader = new URLRequestHeader("Content-type", "application/json");
var request:URLRequest=new URLRequest("http://localhost:8080");
request.requestHeaders.push(hdr);
request.method=URLRequestMethod.POST;
request.useCache=false;
request.cacheResponse=false;
//pass urlVariables instead of JSON Object??
request.data=jsonOb;
var file:File=new File();
configureListeners(file);
file.url='file:///'+str;
try {
file.upload(request);
} catch (e:Error) {
trace('error', e);
}
}
private function configureListeners(dispatcher:IEventDispatcher):void {
dispatcher.addEventListener(ProgressEvent.PROGRESS, uploadProgressHandler, false, 0, false);
dispatcher.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, httpResponseHandler, false, 0, false);
dispatcher.addEventListener(Event.COMPLETE, uploadCompleteHandler, false, 0, true);
dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler, false, 0, true);
dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler, false, 0, true);
dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler, false, 0, true);
}
- 不,您可以将文件上传到任何服务器,无论是本地还是在线
- 您没有忘记任何 header。事实上,file.upload 会将您的 content-type header 更正为 multipart/form-data 并设置正确的边界
- 见 2.
- 见 2.
- 不,file.upload 可以正常工作
- 格式正确
- 好吧,您应该将 JSON 数据作为 URLVariables 发送,以使额外数据起作用。否则 file.upload 将忽略该数据并用文件本身覆盖它。
这是我测试过的代码,可以在这里使用:
Actionscript 代码:(还添加了一个 UPLOAD_COMPLETE_DATA 侦听器,以便在上传时获得 nodejs 响应)
uploadFile("/Users/wouter/test.jpg");
private function uploadFile(str:String):void {
//additional data needs to be a URLVariables instance
var data:URLVariables = new URLVariables();
data.origFile = str;
//no use, upload will reset headers
//var hdr:URLRequestHeader = new URLRequestHeader("Content-type", "application/json");
var request:URLRequest=new URLRequest("http://localhost:8080");
//request.requestHeaders.push(hdr);
request.method=URLRequestMethod.POST;
request.useCache=false;
request.cacheResponse=false;
//pass urlVariables instead of JSON Object??
request.data=data;
var file:File=new File();
configureListeners(file);
file.url='file:///'+str;
try {
file.upload(request);
} catch (e:Error) {
trace('error', e);
}
}
private function configureListeners(dispatcher:IEventDispatcher):void {
dispatcher.addEventListener(ProgressEvent.PROGRESS, uploadProgressHandler, false, 0, false);
dispatcher.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, httpResponseHandler, false, 0, false);
dispatcher.addEventListener(Event.COMPLETE, uploadCompleteHandler, false, 0, true);
dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler, false, 0, true);
dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler, false, 0, true);
dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler, false, 0, true);
//add a UPLOAD_COMPLETE_DATA event to process server response
dispatcher.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, uploadDataComplete, false, 0, true);
}
NodeJS Server(使用 express 4.0 和 multer 0.1.7 处理文件上传):
var express = require('express'),
multer = require('multer');
var app = express();
//auto save file to uploads folder
app.use(multer({ dest: './uploads/'}))
app.post('/', function (req, res) {
console.log(req.body); //contains the variables
console.log(req.files); //contains the file references
res.send('Thank you for uploading!');
});
app.listen(8080);
我在本地主机上设置了一个 NodeJS 服务器(用于测试),我正在使用它对上传的视频文件进行 运行 FFMPEG。这是我要上传到的实际节点应用程序。
https://github.com/madebyhiro/codem-transcode
如果我 运行 在 OSX 控制台中使用
sudo curl -d '{"source_file": "MASTER.flv","destination_file":"converted.mp4","encoder_options": "-vcodec libx264 -vb 416k -s 320x180 -y -threads 0"}' http://localhost:8080/jobs
所以我知道节点服务器 运行ning 正常。
您可以看到特定的 JSON object 是 HTTP POST 请求的一部分。 (在我下面的 AIR 客户端代码示例中,这是我故意留空的 params Object。)
在客户端,我使用 AIR 桌面应用程序来简单地上传视频文件。
很多问题
主要问题就是不能上传文件到 同一台机器到本地服务器?
我的 requestHeaders 中是否遗漏了什么?
- 我应该使用 contentType = "multipart/form-data" 还是其他一些 contentType?
- contentType 是否应该像我在实际 UrlRequest Object 上所做的那样成为 headers 的一部分或定义为 属性?
- 我应该使用 UrlLoader.load 而不是 File.upload 吗?
- file.url 格式是否正确(假设我的 str 值正确)?
- 下面我的 uploadFile 代码方法还有其他错误或遗漏吗?
我正在奖励大量赏金,但前提是 所有 以上问题已 准确 回答,优先给出带有参考或代码示例的答案。这是另一个包含一些有用信息的相关问题 POST file upload using URLRequest
这里是相关的上传代码。 str 是我正在上传的实际视频文件的 nativePath。如前所述,JSON params Object 有意留空,因此需要适当的格式才能正常工作。
function uploadFile(str:String):void {
var params:Object={}
var jsonOb:String = JSON.stringify(params);
var hdr:URLRequestHeader = new URLRequestHeader("Content-type", "application/json");
var request:URLRequest=new URLRequest("http://localhost:8080");
request.requestHeaders.push(hdr);
request.method=URLRequestMethod.POST;
request.useCache=false;
request.cacheResponse=false;
//pass urlVariables instead of JSON Object??
request.data=jsonOb;
var file:File=new File();
configureListeners(file);
file.url='file:///'+str;
try {
file.upload(request);
} catch (e:Error) {
trace('error', e);
}
}
private function configureListeners(dispatcher:IEventDispatcher):void {
dispatcher.addEventListener(ProgressEvent.PROGRESS, uploadProgressHandler, false, 0, false);
dispatcher.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, httpResponseHandler, false, 0, false);
dispatcher.addEventListener(Event.COMPLETE, uploadCompleteHandler, false, 0, true);
dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler, false, 0, true);
dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler, false, 0, true);
dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler, false, 0, true);
}
- 不,您可以将文件上传到任何服务器,无论是本地还是在线
- 您没有忘记任何 header。事实上,file.upload 会将您的 content-type header 更正为 multipart/form-data 并设置正确的边界
- 见 2.
- 见 2.
- 不,file.upload 可以正常工作
- 格式正确
- 好吧,您应该将 JSON 数据作为 URLVariables 发送,以使额外数据起作用。否则 file.upload 将忽略该数据并用文件本身覆盖它。
这是我测试过的代码,可以在这里使用:
Actionscript 代码:(还添加了一个 UPLOAD_COMPLETE_DATA 侦听器,以便在上传时获得 nodejs 响应)
uploadFile("/Users/wouter/test.jpg");
private function uploadFile(str:String):void {
//additional data needs to be a URLVariables instance
var data:URLVariables = new URLVariables();
data.origFile = str;
//no use, upload will reset headers
//var hdr:URLRequestHeader = new URLRequestHeader("Content-type", "application/json");
var request:URLRequest=new URLRequest("http://localhost:8080");
//request.requestHeaders.push(hdr);
request.method=URLRequestMethod.POST;
request.useCache=false;
request.cacheResponse=false;
//pass urlVariables instead of JSON Object??
request.data=data;
var file:File=new File();
configureListeners(file);
file.url='file:///'+str;
try {
file.upload(request);
} catch (e:Error) {
trace('error', e);
}
}
private function configureListeners(dispatcher:IEventDispatcher):void {
dispatcher.addEventListener(ProgressEvent.PROGRESS, uploadProgressHandler, false, 0, false);
dispatcher.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, httpResponseHandler, false, 0, false);
dispatcher.addEventListener(Event.COMPLETE, uploadCompleteHandler, false, 0, true);
dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler, false, 0, true);
dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler, false, 0, true);
dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler, false, 0, true);
//add a UPLOAD_COMPLETE_DATA event to process server response
dispatcher.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, uploadDataComplete, false, 0, true);
}
NodeJS Server(使用 express 4.0 和 multer 0.1.7 处理文件上传):
var express = require('express'),
multer = require('multer');
var app = express();
//auto save file to uploads folder
app.use(multer({ dest: './uploads/'}))
app.post('/', function (req, res) {
console.log(req.body); //contains the variables
console.log(req.files); //contains the file references
res.send('Thank you for uploading!');
});
app.listen(8080);