Как добавить свойство «Альтернативный» к файлу изображения на сервере?

#asp.net #asp.net-web-api #upload #asp.net-core

#asp.net #asp.net-web-api #загрузка #asp.net-core

Вопрос:

Я использую 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);  
});
  

Снимок:

1

Мой вопрос: как добавить новое свойство «Alternate» ICollection<IFormFile> files для определения свойства Alternate , отправляемого с клиента (FormData)?

Ответ №1:

Это не ответ на вопрос 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'] что он всегда первичен и не может быть изменен (взломан кем-то), если мы проверили дубликат загружаемого файла раньше.

Затем мы можем объединить имя файла (in files ) с Key in _alts , чтобы получить альтернативный текст.

Снимок:

2

ОБНОВЛЕНИЕ: код в моментальном снимке был неправильным.