4

これは私のweb-apiコードです:

    [HttpPost]
    public HttpResponseMessage PostFileAsAttachment()
    {
        string path = "D:\\heroAccent.png";
        if (File.Exists(path))
        {

            HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
            var stream = new FileStream(path, FileMode.Open);
            result.Content = new StreamContent(stream);
            result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
            result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
            result.Content.Headers.ContentDisposition.FileName = "xx.png";
            return result;
        }
        return new HttpResponseMessage(HttpStatusCode.NotFound);
    }

そして、ダウンロードファイルを私に強制するようにクライアント側(表示)をコーディングする方法(自動ダウンロードモード(開く、名前を付けて保存)がポップアップする可能性があります...)

4

2 に答える 2

3

前述のように、ajaxから「開く/名前を付けて保存」ダイアログをトリガーすることはできません。

ファイルのダウンロード中に現在のページのコンテンツを保持したい場合は、ページのどこかに非表示のiframeを追加し、ダウンロードリンクに舞台裏でJSを実行させて、そのiframeのsrc属性を適切な場所に設定します。

$('iframeSelector').attr('src', downloadLinkLocation)

FileContentResultを返すアクションでこれをテストしましたが、応答ヘッダーでContentDispositionを設定した場合、WebAPIメソッドで機能しない理由はわかりません。

于 2012-12-03T15:55:08.987 に答える
0

ファイルで使用できるActionResultタイプの1つはFileResultです。転送するコンテンツがディスクファイル内に保存されている場合は、FilePathResultオブジェクトを使用できます。コンテンツがストリームを通じて利用できる場合は、FileStreamResultを使用し、バイト配列として利用できる場合はFileContentResultを選択します。これらのオブジェクトはすべてFileResultから派生し、応答ストリームにデータを書き出す方法のみが異なります。

例:PDFの場合

public FileResult Export()
{
var output = new MemoryStream();
    :
    return File(output.ToArray(), "application/pdf", "MyFile.pdf");
}

Ajax Jqueryを使用してアクションメソッドを呼び出す方法については、以下のリンクをご覧ください。

http://blog.bobcravens.com/2009/11/ajax-calls-to-asp-net-mvc-action-methods-using-jquery/

この記事を参照して、FileResultに関するアイデアを得ることができます。

http://www.dotnetcurry.com/ShowArticle.aspx?ID=807

于 2012-12-03T09:24:33.747 に答える