-1

我正在通过 WebClient 类和 OpenReadAsync 方法将 PDF 文件下载到独立存储。将文件保存到 IsolatedSotrage 后,我将其命名为“file.pdf”,但我需要保留原始名称。我怎样才能做到这一点?我做了一些研究,我知道在下载之前获取文件名很困难而且不是很方便,因为可能缺少一些标题信息。但是下载后呢?我可以在 download.OpenReadCompleted 完成方法中获得它吗?根本不知道何要那样做。

谢谢大家。

4

2 回答 2

0

您需要使用HttpWebRequest并获取响应标头。下面是概念代码的肮脏证明,但它可以很容易地集成到您已经拥有的任何流程中:

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        HttpWebRequest req = HttpWebRequest.CreateHttp("http://www.geekchamp.com/marketplace/components/windows-phone-toolkit-in-depth-3rd-edition/downloadfree?id=381255");

        req.BeginGetResponse(new AsyncCallback(ReadCallback), req);
    }

    private void ReadCallback(IAsyncResult asynchronousResult)
    {
        HttpWebRequest req = (HttpWebRequest)asynchronousResult.AsyncState;
        HttpWebResponse response = (HttpWebResponse)req.EndGetResponse(asynchronousResult);

        // RegEx to extract file name from headers
        var reFile = new Regex("filename=\"(.*?)\"");

        // The header that contains the filename. Example:
        // Content-Disposition: attachment; filename="Windows Phone Toolkit In Depth 3rd Abstract.pdf"
        var contentDisposition = response.Headers["Content-Disposition"];

        // FIXME: this assumes match success. Might be easier to just use a replace
        var filename = reFile.Match(contentDisposition).Groups[1].Value;

        // ... your code here ...
    }
于 2013-06-11T23:59:21.270 回答
0

有人会假设您知道通过 URL 下载的文件名,或者至少您可以解析它。假设,您可以通过 UserState 对象将其传递给事件处理程序:

myClient.OpenReadAsync(url, filenameFromUrl);

然后,在事件处理程序中:

void OnOpenReadCompleted(OpenReadCompletedEventArgs e)
{
   string filename = e.UserState.ToString();
}

如果您不知道 URL 或无法获取文件名,因为它是某种掩盖它的 Web 服务,那么不,您无法从事件 args 中获取它。

于 2013-06-11T20:10:28.170 回答