C#.NET Web API什么是文件上传和下载的最佳实践?

时间:2019-04-26 06:02:02

标签: c# rest asp.net-web-api asp.net-core-2.0 file-transfer

我有一个 C# .NET Core Web API( REST )。 我想为上传文件实现一个端点,为下载文件实现一个(任何文件类型,以二进制形式)。 设计和代码的最佳实践是什么?到目前为止,我在搜索引擎中发现的时间是一周。 您对我有建议吗? 我想我必须将元数据(如标题(类型,..?))保存在其他地方。可以使搜索文件更加容易。

在来自microsoft的此链接上,我遇到了一个问题,那就是它似乎仅适用于MVC API,我没有使用。

之后

[HttpPost("UploadFiles")]
public async Task<IActionResult> Post(List<IFormFile> files)

files为空。

c-sharpcorner中的代码不能更整洁地工作。我的IFormFile类型的目标文件不知道该方法。GetFilename()

enter image description here

2 个答案:

答案 0 :(得分:2)

如果查看IFormFile文档,您会发现它具有属性FileName,可以使用:

https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.http.iformfile?view=aspnetcore-2.2

因此,举例来说,您可以使用该属性并将其保存在该属性的任何位置。在我的情况下,将文件写入存储的所有低级内容都隐藏在存储库中,但是您会想到:

public async Task<IActionResult> Upload(IFormFile file)
{
    if (file == null || file.Length == 0) return BadRequest();
    using (var ms = new MemoryStream())
    {
        file.CopyTo(ms);
        var img = new Entities.Image
        {
            Name = file.FileName,
            ContentType = file.ContentType,
            Data = ms.ToArray()

         };
         await _repo.CreateImage(img);
         return Ok();
    }
}

答案 1 :(得分:2)

关于如何使用.net core at this location.上传/下载文件,有一篇非常不错的文章。该教程同样适用于Web API。

我检查了您的问题,认为它不适合您,许多人想通过邮递员/提琴手检查请求,并检查数据是否正确发送。 This blog包含文件上传Web API的示例

为获取文件名,IFormFile的定义如下:

public interface IFormFile
{
    string ContentType { get; }
    string ContentDisposition { get; }
    IHeaderDictionary Headers { get; }
    long Length { get; }
    string Name { get; }
    string FileName { get; }
    Stream OpenReadStream();
    void CopyTo(Stream target);
    Task CopyToAsync(Stream target, CancellationToken cancellationToken = null);
}

因此,您应该可以使用属性FileName来获取文件名。