0

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

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

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

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

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

4

1 回答 1

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()方法的默认名称。

于 2012-06-22T13:16:36.793 回答