如何将 属性 "Alternate" 添加到服务器上的图像文件?

How to add property "Alternate" to an image file on server?

我正在使用 asp.net 核心和网络 api 上传图片。

在服务器上:

[Produces("application/json")]
[Route("api/Upload")]
public class UploadApiController : Controller
{
    private readonly IHostingEnvironment _environment;

    public UploadApiController(IHostingEnvironment environment)
    {
        _environment = environment;
    }

    [HttpPost]
    public async Task Post(ICollection<IFormFile> files)
    {
        //...
    }
}

在客户端:

// Files is an array that contains all temporary images for uploading.
let Files = [];

let image_preview = function (file) {
    file['Alternate'] = 'alternate_text';
    Files.push(file);

    // other implements...
};

$('button#upload').click(function () {
    let formData = new FormData();

    for (let i = 0; i < Files.length; i++) {
        formData.append('files', Files[i])
    }

    let xhr = new XMLHttpRequest();
    xhr.open('POST', '/api/upload', true);

    xhr.onload = function () {
        console.log('uploading...')
    };  

    xhr.send(formData);  
});

快照:

我的问题:如何向 ICollection<IFormFile> files 添加新的 属性“备用”以检测从客户端 (formData) 发送的 属性 Alternate

这不是问题 How to add property “Alternate” to an image file on server? 的答案,但似乎可以解决问题(发送带有替代文本的图像文件)。

在服务器上:

using Newtonsoft.Json;

[HttpPost]
public async Task Post(ICollection<IFormFile> files, IList<string> alts)
{
    IDictionary<string, string> _alts = new Dictionary<string, string>();

    foreach (var alt in alts)
    {
        IDictionary<string, string> temp = JsonConvert.DeserializeObject<Dictionary<string, string>>(alt);

        foreach (var item in temp)
        {
            _alts.Add(item.Key, item.Value);
        }

    }
}

在客户端:

for (let i = 0; i < Files.length; i++) {
    formData.append('files', Files[i]);

    let name = Files[i]['name'],
        alt = {};

    alt[name] = 'alt_text';

    formData.append('alts', JSON.stringify(alt));
}

我们永远不会在字典中得到重复的键,因为 Files[i]['name'] 始终是主要的,如果我们之前检查过重复的上传文件,则无法更改(被某人黑客攻击)。

然后,我们可以将 files 中的文件名与 _alts 中的 Key 合并以获得替代文本。

快照:

更新:快照中的代码错误。