簡體   English   中英

AIR,URLRequest並將視頻文件上傳到NodeJS服務器

[英]AIR, URLRequest and uploading video file to NodeJS server

我在本地主機上設置了一個NodeJS服務器(用於測試),用於在上傳的視頻文件上運行FFMPEG。 這是我要上傳到的實際節點應用程序。
https://github.com/madebyhiro/codem-transcode
如果我使用以下命令在OSX控制台中運行curl作業,則實際的轉換過程將正常工作

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

所以我知道節點服務器運行正常。

您可以看到,特定的JSON對象是HTTP POST請求的一部分。 (在下面的AIR客戶端代碼示例中,這是我故意留空的params對象。)

在客戶端,我正在使用AIR for Desktop應用程序來簡單地上傳視頻文件。

許多問題

  1. 一個主要的問題僅僅是您不能將同一台計算機上的文件上傳到本地服務器嗎?

  2. 我的requestHeaders是否缺少某些內容?

  3. 我應該使用contentType =“ multipart / form-data”還是其他一些contentType?
  4. 是否應該像我已經將contentType包含在標頭中一樣,還是將其定義為實際UrlRequest對象的屬性?
  5. 我應該使用UrlLoader.load而不是File.upload嗎?
  6. file.url的格式是否正確(假設我的str值正確)?
  7. 以下我的uploadFile代碼方法中是否還有其他錯誤或遺漏?

我非常賞心悅目,但前提是必須正確回答所有上述所有問題,並且優先選擇帶有參考文獻或代碼示例的答案。 這是另一個相關問題,提供了一些有用的信息, 使用URLRequest上傳POST文件

這是相關的上傳代碼。 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. 您沒有忘記任何標題。 實際上,file.upload會將您的內容類型標頭更正為multipart / form-data並設置正確的邊界
  3. 見2。
  4. 見2。
  5. 不,file.upload可以正常工作
  6. 格式正確
  7. 好了,您應該將JSON數據作為URLVariables發送,以便額外的數據起作用。 否則,file.upload將忽略該數據,並使用文件本身覆蓋它。

這是我測試過的代碼,可以在這里工作:

動作代碼 :(還添加了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服務器 (使用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM