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

时间:2018-07-25 11:12:43

标签: 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($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循环之外-如果我必须对文件进行处理,应该放在该注释上?

2 个答案:

答案 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有更多的经验,则可能需要对其进行一些优化。也许直接使用内存流而不是字节数组来进行处理。