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 桌面应用程序来简单地上传视频文件。

很多问题

  1. 主要问题就是不能上传文件到 同一台机器到本地服务器?

  2. 我的 requestHeaders 中是否遗漏了什么?

  3. 我应该使用 contentType = "multipart/form-data" 还是其他一些 contentType?
  4. contentType 是否应该像我在实际 UrlRequest Object 上所做的那样成为 headers 的一部分或定义为 属性?
  5. 我应该使用 UrlLoader.load 而不是 File.upload 吗?
  6. file.url 格式是否正确(假设我的 str 值正确)?
  7. 下面我的 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);
        }
  1. 不,您可以将文件上传到任何服务器,无论是本地还是在线
  2. 您没有忘记任何 header。事实上,file.upload 会将您的 content-type header 更正为 multipart/form-data 并设置正确的边界
  3. 见 2.
  4. 见 2.
  5. 不,file.upload 可以正常工作
  6. 格式正确
  7. 好吧,您应该将 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);