

ASP.NET MVC5 でcsv出力をしようとしています。

パラメータの複数ある画面で、ボタンも複数あるためAjaxを使用してPostしています。  
ファイルのダウンロードがされず、またファイル作成もできず困っています。

[code]

    //以下、抜粋
    $('#download').click(
                function () {
                    var param= new Object();
                    //param set
                    if (parking != null) {
                        $.ajax({
                            type: "POST",
                            url: "@Url.Action("CreateCsv", "Csv")",
                            data: JSON.stringify(param),
                            contentType: "application/json; charset=utf-8",
                            datatype:'json',
                            success: function () {
                                debugger
                                alert("success");
                            },
                            failure: function (data) {
                                debugger
                                alert(data.StatusMessage);
                            },
                            error: function (data) {
                                debugger
                                alert(data.StatusMessage);
                            }
                        })
                    }
                }
            );
    
    
    [HttpPost]
            public ActionResult CreateCsv(Param Pram)
            {
                if (Request.IsAjaxRequest())
                {
    
                    // DB からデータ取得
    
                    // CSV 内容生成
    
                     var fileName = string.Format("filename_{0}.csv", DateTime.Now.ToString("yyyyMMddHHmmss"));
    
                    var data = Encoding.UTF8.GetBytes(csvString);
    
                    var stream = new MemoryStream(data);
                    var writer = new StreamWriter(stream);
    
                    //var fileStreamResult = new FileStreamResult(stream, System.Net.Mime.MediaTypeNames .Text.Plain);
                    //fileStreamResult.FileDownloadName = fileName;
    
                    //return fileStreamResult;
    
                    writer.Write(data);
                    writer.Flush();
                    stream.Position = 0;
    
                    return File(stream, "text/csv", fileName);
    
                }
                return null ;
            }
    
[/code]


CC BY-SA 4.0
2019-01-25T09:42:36.760
52317
2019-01-26T12:22:46.180
31925
question
asp.net ajax mvc
ASP.NET MVC5 でcsvをpostでダウンロードするには


最後の `return` する部分。

[code]

        return File(stream, "text/csv", fileName);
    
[/code]

を、このようにしてみてはどうでしょう？

[code]

        return File(stream.ToArray(), "text/csv", fileName);
    
[/code]

この辺の記事が、そんな風に `byte[]` に変換してから返しているので。

[ASP.NET MVC
ファイルのダウンロード](http://haronoid.hatenablog.com/entry/2018/06/20/112035)  
[How to download memorystream to a
file?](https://stackoverflow.com/q/16558317/9014308)

おそらく、[FileResult Class](https://docs.microsoft.com/en-
us/dotnet/api/system.web.mvc.fileresult?view=aspnet-mvc-5.2) で以下のように書いてあって、

[code]

    Derived  System.Web.Mvc.FileContentResult
             System.Web.Mvc.FilePathResult
             System.Web.Mvc.FileStreamResult
    
[/code]

[FileStreamResult Class](https://docs.microsoft.com/en-
us/dotnet/api/system.web.mvc.filestreamresult?view=aspnet-mvc-5.2)
でこうなので、`MemoryStream` でも行ける？ となったのかも。

> Sends binary content to the response by using a `Stream` instance.


CC BY-SA 4.0
2019-01-26T12:22:46.180
52338
2019-01-26T12:22:46.180
26370
52317
answer