C# 如何处理内存流中的文件?
我正在从Vue.js前端发布一个或多个文件。它是这样做的: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(
<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。@cbllformFile
对象是类型formFile。
这可能是您的内部类型?我在.NET文档中找不到对它的引用。stream
对象是FileStream
。根据您所做的,这个流
有您所需要的。请参阅此链接以获取FileStream
类的文档。因此,在您放置注释的地方,我只需调用formFile
,我就可以访问它了?或者它是流吗?哦,使用他们的示例,它说它在调试时接收到零文件。.有什么是up、 :-(除非您打算将FileStream保存到磁盘,否则您并不真正需要它。您可以直接使用formFile。@cbllformFile
对象是类型formFile。
这可能是您的内部类型?我在.NET文档中找不到对它的引用。stream
对象是FileStream
。根据您所做的,此流
满足您的需要。请参阅此链接以获取FileStream
类的文档。确实很可怕。我甚至无法让文件到达端点,IFormFile始终为空。我必须将其解析为…UploadFiles(IFormCollection集合)
。现在它实际上有一个计数和内容。谢谢你的建议I@cbll您好,我也有类似的问题。您在哪里使用了上传文件(IFormCollection)
?在中的某个地方使用了(var memoryStream=new memoryStream())
?因为我不明白。这确实很可怕。我甚至无法找到要点击的文件