У меня есть программа на C # (.NET 4.5), которая использует MultipartFormDataContent для отправки данных на веб-сервер. Файл добавляется с этим кодом:
FileStream stream = new FileStream(fPath, FileMode.Open, FileAccess.Read);
content.Add(new StreamContent(stream), "file0", fPath);
Эта версия MultipartFormDataContent.Add имеет следующие параметры:
public void Add(HttpContent content, string name, string fileName);
Эта версия метода Add задокументирована здесь . Официальные директивы MDN для заголовков Content-Disposition задокументированы здесь . Реальность: когда запрос поступает на сервер, часть формы имеет следующие заголовки:
{'name': 'Content-Disposition', 'value': 'form-data', 'params': {}}
Оба name
и filename
отсутствуют в заголовках! Если я использую двухпараметрическую версию метода Add:
FileStream stream = new FileStream(fPath, FileMode.Open, FileAccess.Read);
content.Add(new StreamContent(stream), fPath);
, то заголовок поступает на сервер, например:
{'name': 'Content-Disposition', 'value': 'form-data', 'params': {'name': 'c:\\temp\test.txt'}}
Другими словами: двухпараметрическая версия устанавливаетНазвание поля правильно. Версия с тремя параметрами не только забывает посылать параметр filename
, но также испаряет параметр name
.
Для сравнения, это то, что я вижу, когда я ВЫСТАВЛЯЮ аналогичные данные multipart / form с веб-страницы с помощью Firefox:
{'name': 'Content-Disposition', 'value': 'form-data', 'params': {'name': 'file', 'filename': 'test.txt'}}
{'name': 'Content-Type', 'value': 'text/plain', 'params': {}}
Я что-то не так делаю? Действительно ли это ошибка в .NET / C #? Мне действительно нужно знать имя файла на стороне сервера, и оно должно быть совместимым с другими запросами, отправленными из других браузеров. Поэтому я не могу просто добавить дополнительные заголовки и отправить туда имя файла. Он должен быть совместим с другими браузерами. Как я должен отправить имя файла из C #?