Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 发送一个我想制作的文件,并作为IHttpActionResult存储在内存中_C#_Http_Export To Csv - Fatal编程技术网

C# 发送一个我想制作的文件,并作为IHttpActionResult存储在内存中

C# 发送一个我想制作的文件,并作为IHttpActionResult存储在内存中,c#,http,export-to-csv,C#,Http,Export To Csv,我甚至不确定我想做什么是可能的 我目前正在开发一个AngularJS web应用程序,需要实现一种方法,从我的数据库中获取数据,将其存储到列表,将该列表解析为.csv文件并加载到内存中,这样我就可以将其作为HttpResponseMessage发送回去 我已经有了列表变量中的所有数据,并将使用CSVHelper将其解析为文件,但我在网上找到的所有示例都向我展示了如何使用file.writealText()本地导出文件,并且它们都使用file.OpenRead(filePath)本地读取文件 如何

我甚至不确定我想做什么是可能的

我目前正在开发一个AngularJS web应用程序,需要实现一种方法,从我的数据库中获取数据,将其存储到
列表
,将该
列表
解析为.csv文件并加载到内存中,这样我就可以将其作为
HttpResponseMessage
发送回去

我已经有了
列表
变量中的所有数据,并将使用CSVHelper将其解析为文件,但我在网上找到的所有示例都向我展示了如何使用
file.writealText()
本地导出文件,并且它们都使用
file.OpenRead(filePath)
本地读取文件

如何在内存中创建和存储文件,并将其作为
HttpResponseMessage
发送回


编辑:

在四处挖掘之后,我终于想出了这个,尽管它不起作用。当我运行代码时,我得到“无法访问此站点。连接是rest”。 chrome中的“连接重置”错误

希望这有助于可视化我正在尝试做的事情

Javascript文件

me.downloadFile = function (fileId) {

    $http({
        method: 'POST',
        url: 'api/notices/CheckFileExists',
        params: { fileId: fileId }
    }).then(function success(result) {
        if (result.data === 'Y') {
            me.downloadOpen("POST", 'api/notices/DownloadFile?fileId=' + fileId, "", "");
        }
        else {
            $mdToast.show(
                $mdToast.simple()
                    .textContent(result.data)
                    .position("bottom right")
                    .hideDelay(2000)
            );
        }
    });
};

me.downloadOpen = function (verb, url, data, target) {
    var form = document.createElement("form");
    form.action = url;
    form.method = verb;
    form.target = target || "_self";

    if (data) {
        for (var key in data) {
            var input = document.createElement("input");
            input.name = key;
            input.value = typeof data[key] === "object" ? JSON.stringify(data[key]) : data[key];
            form.appendChild(input);
        }
    }

    form.style.display = 'none';
    document.body.appendChild(form);
    form.submit();
    document.body.removeChild(form);
C#


要创建csv文件并将其保存在内存中,您需要在CSVHelper代码之前实例化内存流。然后,您可以从控制器返回内存流字节数组作为base64字符串

[HttpGet]
public IHttpActionResult Get(params)
{
    var result = "";
    using (var memoryStream = new MemoryStream())
    {
        using (var streamWriter = new StreamWriter(memoryStream))
        using (var csvWriter = new CsvWriter(streamWriter))
        {
            csvWriter.WriteRecords(listOfObjects);
        } 

        result = Convert.ToBase64String(memoryStream.ToArray()); 
    }

    return Ok(result);
}

在前端,您可能希望利用FileSaver.js库。它要求您首先将base64字符串转换为blob。这里有很多JS示例()。

我将在web上找到的一些东西拼凑在一起,找到了答案。万一有人遇到类似的问题,这就是我发现适用于我的案例的代码。javascript是一样的,但我对C#做了一些小改动

我没有发回
StreamContent
而是发回
StringContent
。这样,我所需要做的就是将数据写入CSV文件,然后将其读入字符串

代码如下:

[HttpPost]
    public HttpResponseMessage DownloadFile(int fileId)
    {
        var user = GetUser();
        var fileContent = NoticesMethods.GetNoticeFile(fileId, user);


        using (Globals.WebAppsImpersonator())
        {
            if (fileContent.Count > 0)
            {
                using (var mem = new MemoryStream())
                using (var reader = new StreamReader(mem))
                using (var writer = new StreamWriter(mem))
                using (var csvWriter = new CsvWriter(writer))
                {
                    csvWriter.Configuration.Delimiter = ",";
                    csvWriter.WriteField("File ID");
                    csvWriter.WriteField("Account");
                    csvWriter.WriteField("Move Date");
                    csvWriter.NextRecord();

                    foreach (var row in fileContent)
                    {
                        csvWriter.WriteField("\"" + row.FileId + "\"");
                        csvWriter.WriteField("\"" + row.Account + "\"");
                        csvWriter.WriteField("\"" + row.MoveDate + "\"");
                        csvWriter.NextRecord();
                    }

                    writer.Flush();
                    mem.Position = 0;

                    var file = reader.ReadToEnd();

                    HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
                    result.Content = new StringContent(file);
                    result.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv");
                    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
                    result.Content.Headers.ContentDisposition.FileName = "Notice.csv";

                    return result;
                }
            }
            return new HttpResponseMessage(HttpStatusCode.NotFound);
        }
    }

感谢William抽出时间,我确实对问题做了一个更改,那就是我犯了一个错误,我需要返回
HttpResponseMessage
而不是
ihttpackationresult
。无论如何,我会尝试一下,让你知道我发现了什么。我无法使用你的代码让它工作,但你的代码帮助我找到了正确的方向。再次感谢您抽出时间!!很高兴我能帮助一些人:)
[HttpPost]
    public HttpResponseMessage DownloadFile(int fileId)
    {
        var user = GetUser();
        var fileContent = NoticesMethods.GetNoticeFile(fileId, user);


        using (Globals.WebAppsImpersonator())
        {
            if (fileContent.Count > 0)
            {
                using (var mem = new MemoryStream())
                using (var reader = new StreamReader(mem))
                using (var writer = new StreamWriter(mem))
                using (var csvWriter = new CsvWriter(writer))
                {
                    csvWriter.Configuration.Delimiter = ",";
                    csvWriter.WriteField("File ID");
                    csvWriter.WriteField("Account");
                    csvWriter.WriteField("Move Date");
                    csvWriter.NextRecord();

                    foreach (var row in fileContent)
                    {
                        csvWriter.WriteField("\"" + row.FileId + "\"");
                        csvWriter.WriteField("\"" + row.Account + "\"");
                        csvWriter.WriteField("\"" + row.MoveDate + "\"");
                        csvWriter.NextRecord();
                    }

                    writer.Flush();
                    mem.Position = 0;

                    var file = reader.ReadToEnd();

                    HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
                    result.Content = new StringContent(file);
                    result.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv");
                    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
                    result.Content.Headers.ContentDisposition.FileName = "Notice.csv";

                    return result;
                }
            }
            return new HttpResponseMessage(HttpStatusCode.NotFound);
        }
    }