3

MVC ActionResult をバイト配列 (ファイル) に保存する良い方法を探しています。これは、Rotativa を使用して HTML ビューを PDF に変換しているためです。これはうまく機能し、ブラウザーに PDF が表示されたユーザーを返します。今度は、同じ PDF を添付ファイルとして含めて、サーバーから電子メールを送信したいと考えています。電子メールの送信には、ActionMailer.Net nuget パッケージを使用しています。これには、添付ファイルとしてバイト配列を含めるオプションがあります。

そのため、PDF ファイルを含むバイト配列を send mail メソッドに渡す必要があります。しかし、PDF を返すアクションには、(残念ながら) FileStreamResult ではなく、returntype として ActionResult があります。なぜこの選択​​がなされたのか正確にはわかりませんが、それはそれです。

Rotativa パッケージは Wkhtmltopdf を使用して HTML を変換します。私はそれを自分で実装できると思いますが、必要なものを正確に返すメソッドが既にあるので、それはちょっと無意味に思えます。その結果をバイト配列に取得する方法が必要なだけです。

4

3 に答える 3

0

PDFを返し、結果をバイト配列として保存することになっているコントローラーアクションにHTTPリクエストを送信できます。このWebClient.DownloadData方法は適切だと思われます。

コンテキスト(セッション、認証されたユーザー)を保持する場合は、Cookieヘッダーを設定する必要があります。

client.Headers[HttpRequestHeader.Cookie] = Request.Headers["Cookie"];
于 2012-11-15T11:49:20.343 に答える
0

私は同じ問題を抱えています、これが私の解決策です:

基本的には、独自の URL に対して HTTP 要求を行い、出力をバイナリ ファイルとして保存する必要があります。シンプルで、オーバーロードなし、ヘルパー クラス、肥大化したもの。

次の方法が必要です。

    // Returns the results of fetching the requested HTML page.
    public static void SaveHttpResponseAsFile(string RequestUrl, string FilePath)
    {
        try
        {
            HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(RequestUrl);
            httpRequest.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)";
            httpRequest.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
            HttpWebResponse response = null;
            try
            {
                response = (HttpWebResponse)httpRequest.GetResponse();
            }
            catch (System.Net.WebException ex)
            {
                if (ex.Status == WebExceptionStatus.ProtocolError)
                    response = (HttpWebResponse)ex.Response;
            }

            using (Stream responseStream = response.GetResponseStream())
            {
                Stream FinalStream = responseStream;
                if (response.ContentEncoding.ToLower().Contains("gzip"))
                    FinalStream = new GZipStream(FinalStream, CompressionMode.Decompress);
                else if (response.ContentEncoding.ToLower().Contains("deflate"))
                    FinalStream = new DeflateStream(FinalStream, CompressionMode.Decompress);

                using (var fileStream = System.IO.File.Create(FilePath))
                {
                    FinalStream.CopyTo(fileStream);
                }

                response.Close();
                FinalStream.Close();
            }
        }
        catch
        { }
    }

次に、コントローラー内で、次のように呼び出します。

SaveHttpResponseAsFile("http://localhost:52515/Management/ViewPDFInvoice/" + ID.ToString(), "C:\\temp\\test.pdf");

そしてワラ!ファイルはファイル システムにあり、PDF をダブルクリックして開くか、ユーザーにメールで送信するか、必要なものは何でも...

于 2013-03-03T01:39:48.533 に答える