我在本地主机上设置了一个 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
所以我知道节点服务器运行正常。
您可以看到作为 HTTP POST 请求的一部分需要特定的 JSON 对象。(在下面我的 AIR 客户端代码示例中,这是我故意留空的params对象。)
在客户端,我使用 AIR for desktop 应用程序来简单地上传视频文件。
许多问题
一个主要问题仅仅是您无法将同一台机器上的文件上传到本地服务器吗?
我的 requestHeaders 是否遗漏了什么?
- 我应该使用 contentType = "multipart/form-data" 还是其他一些 contentType?
- contentType 是否应该像我所做的那样成为标题的一部分,或者定义为实际 UrlRequest 对象的属性?
- 我应该使用 UrlLoader.load 而不是 File.upload 吗?
- file.url格式是否正确(假设我的str值正确)?
- 下面我的uploadFile代码方法中还有其他错误或遗漏吗?
我奖励一大笔赏金,但前提是所有上述问题都得到了准确的回答,优先考虑带有参考或代码示例的答案。这是另一个相关问题,其中包含一些有用的信息POST 文件上传使用 URLRequest
这是相关的上传代码。str是我正在上传的实际视频文件的 nativePath。如前所述,JSON参数对象已故意留空,因此需要适当的格式才能使其正常工作。
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);
}