如何使用标头中的文件名作为FileReference.download的默认文件名?

时间:2012-06-22 12:50:51

标签: flex air

在我们的AIR应用程序中,我希望用户能够将文件下载到他选择的位置。这可以通过以下方式轻松完成:

var fileReference:FileReference = new FileReference();
fileReference.download( request );

URLRequest指向servlet http://myserver/myapp/download。如果我在Web应用程序中执行navigateToUrl,浏览器将正确使用服务器在HTTP标头中放置的文件名。但是,在AIR应用程序中,它会建议download作为用户的文件名(因为这可能是URL的最后一部分)。

如何确保AIR应用程序中的下载也将使用该名称?

我知道download方法有一个可选的第二个参数来设置默认文件名,但我不知道客户端编译时HTTP头中的文件名是什么。

1 个答案:

答案 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()方法。