在我们的AIR应用程序中,我希望用户能够将文件下载到他选择的位置。这可以通过以下方式轻松完成:
var fileReference:FileReference = new FileReference();
fileReference.download( request );
URLRequest
指向servlet http://myserver/myapp/download
。如果我在Web应用程序中执行navigateToUrl
,浏览器将正确使用服务器在HTTP标头中放置的文件名。但是,在AIR应用程序中,它会建议download
作为用户的文件名(因为这可能是URL的最后一部分)。
如何确保AIR应用程序中的下载也将使用该名称?
我知道download
方法有一个可选的第二个参数来设置默认文件名,但我不知道客户端编译时HTTP头中的文件名是什么。
答案 0 :(得分:0)
我设法使用以下代码:
var stream:URLStream = new URLStream();
stream.addEventListener( HTTPStatusEvent.HTTP_RESPONSE_STATUS, function ( event:HTTPStatusEvent ):void
{
var fileName:String;
for each(var requestHeader:URLRequestHeader in event.responseHeaders)
{
if (requestHeader.name == "Content-Disposition")
{
fileName = requestHeader.value.substring( requestHeader.value.indexOf( "=" ) + 2, requestHeader.value.length - 1 );
logger.info( "Found filename in HTTP headers: {0}", [fileName] );
break;
}
}
stream.close();
logger.info("Start file download...");
var fileReference:FileReference = new FileReference();
fileReference.addEventListener(Event.COMPLETE, download_completeHandler );
fileReference.addEventListener(ProgressEvent.PROGRESS, download_progressHandler );
fileReference.download( request, fileName );
} );
stream.load( request );
我首先使用URLStream
类来获取HTTP标头。一旦我有标题,我关闭流(因为它是一个大文件,我不想下载实际数据)。从标题中,我提取Content-Disposition
部分中的文件名,并使用该名称作为默认名称传递给FileReference.download()
方法。