我正在从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>
然后我通过这种方法发布它:
function upload(formData) {
const url = `${BASE_URL}/api/upload`;
return axios.post(url, formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
})
}
似乎可以完成这项工作。
按照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 });
}
}
}
我对来自Java的C#有点陌生:Microsoft docs found here表示“处理上传的文件”是什么意思?
如何从内存流访问它们?为什么注释不在for循环之外-如果我必须对文件进行处理,应该放在该注释上?
答案 0 :(得分:1)
看来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的文章可能会误导您。
答案 1 :(得分:1)
哇,微软的例子太可怕了。
假设您有一个名为IFormFile
的{{1}}(我相信您可以自己编写该循环),那么最简单的准系统方法是:
formFile
您只是将字节复制了两次,分别在原始格式文件中,流中和字节数组中,因此,如果您对.NET有更多的经验,则可能需要对其进行一些优化。也许直接使用内存流而不是字节数组来进行处理。