3

次のような形式の URL からアクセスできるサーバー上のファイルがあります: http:// address/Attachments.aspx?id=GUID

GUID にアクセスでき、複数のファイルを同じフォルダーにダウンロードできる必要があります。

その URL を取得してブラウザに表示すると、ファイルがダウンロードされ、元のファイル名が付けられます。

その動作を C# で再現したいと考えています。WebClient クラスの DownloadFile メソッドを使用してみましたが、新しいファイル名を指定する必要があります。さらに悪いことに、DownloadFile は既存のファイルを上書きします。すべてのファイルに一意の名前を生成できることはわかっていますが、元の名前が本当に好きです。

元のファイル名を保持したままファイルをダウンロードすることはできますか?

アップデート:

以下の素晴らしい答えを使用して WebReqest クラスを使用すると、完全に機能する次のようになりました。

    public override void OnAttachmentSaved(string filePath)
    {
        var webClient = new WebClient();

        //get file name
        var request = WebRequest.Create(filePath);
        var response = request.GetResponse();
        var contentDisposition = response.Headers["Content-Disposition"];
        const string contentFileNamePortion = "filename=";
        var fileNameStartIndex = contentDisposition.IndexOf(contentFileNamePortion, StringComparison.InvariantCulture) + contentFileNamePortion.Length;
        var originalFileNameLength = contentDisposition.Length - fileNameStartIndex;
        var originalFileName = contentDisposition.Substring(fileNameStartIndex, originalFileNameLength);

        //download file
        webClient.UseDefaultCredentials = true;
        webClient.DownloadFile(filePath, String.Format(@"C:\inetpub\Attachments Test\{0}", originalFileName));            
    }

実際のファイル名を取得するには、文字列を少し操作する必要がありました。私はとても興奮しています。みんな、ありがとう!

4

1 に答える 1

8

コメントで示唆されているように、ファイル名はContent-Dispositionヘッダーで利用可能になります。を使用するときにその値を取得する方法はわかりませんWebClientが、:を使用するとかなり簡単WebRequestです。

WebRequest request = WebRequest.Create("http://address/Attachments.aspx?id=GUID");
WebResponse response = request.GetResponse();
string originalFileName = response.Headers["Content-Disposition"];
Stream streamWithFileBody = response.GetResponseStream();
于 2012-11-02T19:06:09.217 に答える