C# 如何处理内存流中的文件?

C# 如何处理内存流中的文件?,c#,.net-core,C#,.net Core,我正在从Vue.js前端发布一个或多个文件。它是这样做的: <form enctype="multipart/form-data" novalidate v-if="isInitial || isSaving"> <div class="dropbox"> <input type="file" multiple :name="uploadFieldName" :disabled="isSaving" @change="filesChange(

我正在从Vue.js前端发布一个或多个文件。它是这样做的:

<form enctype="multipart/form-data" novalidate v-if="isInitial || isSaving">
    <div class="dropbox">
        <input type="file" multiple :name="uploadFieldName" :disabled="isSaving" @change="filesChange($event.target.name, $event.target.files); fileCount = $event.target.files.length" accept=".json" class="input-file">
        <p v-if="isInitial">
            Drag files here to begin <br> or click to browse
        </p>
        <p v-if="isSaving">
            Uploading {{ fileCount }} files...
        </p>
    </div>
</form>
这似乎很管用

根据Microsoft自己的指南,我创建了以下端点:

namespace WebApplication6.Controllers
{
    public class UploadController : Controller
    {
        [HttpPost]
        [Route("/api/upload")]
        public async Task<IActionResult> UploadFiles(List<IFormFile> files)
        {
            long size = files.Sum(f => f.Length);

            // full path to file in temp location
            var filePath = Path.GetTempFileName();

            foreach (var formFile in files)
            {
                if (formFile.Length > 0)
                {
                    using (var stream = new FileStream(filePath, FileMode.Create))
                    {
                        await formFile.CopyToAsync(stream);
                    }
                }
            }

            // process uploaded files <-- What does this entail? How do I access the stream?

            return Ok(new { count = files.Count, size, filePath });
        }
    }
}
命名空间WebApplication6.控制器
{
公共类上载控制器:控制器
{
[HttpPost]
[路由(“/api/upload”)]
公共异步任务上载文件(列表文件)
{
long size=files.Sum(f=>f.Length);
//临时位置中文件的完整路径
var filePath=Path.GetTempFileName();
foreach(文件中的var formFile)
{
如果(formFile.Length>0)
{
使用(var stream=newfilestream(filePath,FileMode.Create))
{
等待formFile.CopyToAsync(流);
}
}
}

//处理上传的文件看来Microsoft文档可能有点误导

foreach (var formFile in files)
{
    if (formFile.Length > 0)
    {
        using (var stream = new FileStream(filePath, FileMode.Create))
        {
            await formFile.CopyToAsync(stream);
            // here you have access to each individual file
        }
    }
}

using
语句中,您可以操作
stream
对象,即将其保存到其唯一的文件路径,处理文件中的数据(如果是
.csv
),等等。问题有点广泛,但Microsoft文章可能对您有点误导。

看起来Microsoft文档可能有点误导

foreach (var formFile in files)
{
    if (formFile.Length > 0)
    {
        using (var stream = new FileStream(filePath, FileMode.Create))
        {
            await formFile.CopyToAsync(stream);
            // here you have access to each individual file
        }
    }
}

using
语句中,您可以操作
stream
对象,即将其保存到其唯一的文件路径,处理文件中的数据(如果是
.csv
),等等。问题有点广泛,但Microsoft文章可能对您有点误导。

哇,Microsoft示例太可怕了

假设您有一个名为
formFile
formFile
文件(我相信您自己能够编写该循环),最简单的方法是:

using (var memoryStream = new MemoryStream())
{
    await formFile.CopyToAsync(memoryStream);
    byte[] bytes = memoryStream.ToArray();

    // do what you want with the bytes
}

您只需将字节复制两次,在原始表单文件中,在流中,然后复制到字节数组中,因此当您在.NET中有更多经验时,您可能需要对其进行一些优化。也许可以直接使用内存流而不是字节数组来进行处理。

哇,Microsoft示例太可怕了

假设您有一个名为
formFile
formFile
文件(我相信您自己能够编写该循环),最简单的方法是:

using (var memoryStream = new MemoryStream())
{
    await formFile.CopyToAsync(memoryStream);
    byte[] bytes = memoryStream.ToArray();

    // do what you want with the bytes
}


您只需将字节复制两次,在原始表单文件中,在流中,然后复制到字节数组中,因此当您在.NET中有更多的经验时,您可能需要对其进行一些优化。您可以直接使用内存流而不是字节数组来进行处理。

这取决于您所说的“
处理”
”.保存到磁盘?打开并读取内容?发送电子邮件?将数据从流复制到数据库?过程可能意味着任何事情…足够公平-让我们假设过程意味着访问文件名并读取内容?这不是最好的示例。如果上载两个文件,则第二个文件将覆盖第一个文件,因为示例代码使用单个文件路径它表示using(var stream=new filestream(filepath,filemode.create)){await formfile.copytoasync(stream);}的位将文件保存到磁盘…只需查看formfile.的文档,以及您可以作为流获得的文件内容,或者您现在在代码中已经拥有它的方式。这取决于您所说的“
process
”是什么意思.保存到磁盘?打开并读取内容?发送电子邮件?将数据从流复制到数据库?过程可能意味着任何事情…足够公平-让我们假设过程意味着访问文件名并读取内容?这不是最好的示例。如果上载两个文件,则第二个文件将覆盖第一个文件,因为示例代码使用单个文件路径表示使用的位(var stream=new filestream(filepath,filemode.create)){await formfile.copytoasync(stream);}将文件保存到磁盘…只需查看IFormFile.的文档,以及您可以以流的形式获取的文件内容,或者以您现在代码中已有的方式获取的文件内容。因此,在您放置注释的地方,我只需调用
formFile
,我就可以访问它了?或者它是流吗?哦,使用他们的示例,它表示当d有事情发生了-(除非您打算将FileStream保存到磁盘,否则您并不真正需要它。您可以直接使用formFile。@cbll
formFile
对象是类型
formFile。
这可能是您的内部类型?我在.NET文档中找不到对它的引用。
stream
对象是
FileStream
。根据您所做的,这个
有您所需要的。请参阅此链接以获取
FileStream
类的文档。因此,在您放置注释的地方,我只需调用
formFile
,我就可以访问它了?或者它是流吗?哦,使用他们的示例,它说它在调试时接收到零文件。.有什么是up、 :-(除非您打算将FileStream保存到磁盘,否则您并不真正需要它。您可以直接使用formFile。@cbll
formFile
对象是类型
formFile。
这可能是您的内部类型?我在.NET文档中找不到对它的引用。
stream
对象是
FileStream
。根据您所做的,此
满足您的需要。请参阅此链接以获取
FileStream
类的文档。确实很可怕。我甚至无法让文件到达端点,IFormFile始终为空。我必须将其解析为
…UploadFiles(IFormCollection集合)
。现在它实际上有一个计数和内容。谢谢你的建议I@cbll您好,我也有类似的问题。您在哪里使用了
上传文件(IFormCollection)
?在
中的某个地方使用了(var memoryStream=new memoryStream())
?因为我不明白。这确实很可怕。我甚至无法找到要点击的文件