.Net multipart/form-data form enctype и «специальные» символы UTF-8 => � (MVC с HttpPostedFileBase)

Цель:

Загрузить/отправить файл CSV с символами UTF-8 в действие MVC, прочитать данные и вставить их в таблицу базы данных.

Проблема:

Проходят только обычные текстовые символы. «Специальные» символы UTF-8, такие как á, не проходят правильно, в коде и в базе данных они отображаются как этот символ => �.

Подробнее:

Я убежден, что это не проблема с моим кодом C#, хотя я включил важные части ниже.

Я думал, что проблема в том, что загруженный файл закодирован как обычный текст или "простой/текстовый" тип MIME, но я смог изменить это, изменив расширение файла на .html

Резюме:

Как получить форму с атрибутом enctype со значением «multipart/form-data», чтобы правильно интерпретировать символы UTF-8 в опубликованном файле?

Исследования:

Судя по моим исследованиям, это общая проблема, не имеющая общего и ясного решения.

Я нашел больше решений для java и PHP, чем для .Net.


  • переменная csvFile имеет тип HttpPostedFileBase

  • это сигнатура действия MVC

[HttpPost]

public ActionResult LoadFromCsv(HttpPostedFileBase csvFile)


Что я пробовал:

1)

using (Stream inputStream = csvFile.InputStream)
{
    byte[] bytes = ReadFully(inputStream);
    string bytesConverted = new UTF8Encoding().GetString(bytes);
}

2)

using (Stream inputStream = csvFile.InputStream)
{
    using (StreamReader readStream = new StreamReader(inputStream, Encoding.UTF8, true))
    {
        while (!readStream.EndOfStream)
        {
            string csvLine = readStream.ReadLine();
            // string csvLine = new UTF8Encoding().GetString(new UTF8Encoding().GetBytes(readStream.ReadLine())); // stupid... this can not be the way!
        }
    }
}

3)

<form method="post" enctype="multipart/form-data" accept-charset="UTF-8">

4)

<input type="file" id="csvFile" name="csvFile" accept="UTF-8" />

<input type="file" id="csvFile" name="csvFile" accept="text/html" />

5)

Когда файл имеет расширение .txt, свойство ContentType базы данных HttpPostedFileBase имеет значение "текст/обычный"

Когда я изменяю расширение файла с .txt на .csv, свойство ContentType базы данных HttpPostedFileBase имеет значение application/vnd.ms-excel"

Когда я изменяю расширение файла на .html, свойство ContentType базы данных HttpPostedFileBase имеет значение "text/html" — я думал, что это будет победителем, но это не так.


В душе я должен верить, что есть простое решение этой проблемы. Меня удивляет, что я не смог разобраться с этим самостоятельно, загрузка символов UTF-8 в файл - обычная задача! Почему я терплю неудачу здесь?!?!

Возможно, мне нужно настроить MIME-типы в IIS для веб-сайта?

Возможно, мне нужны другие теги DOCTYPE/html/метатеги?


@Gabe -

Вот как мой пост выглядит в Fiddler. Это действительно интересно, потому что � просто как день, прямо в значении сообщения.

http://localhost/AwesomeGeography/GeoBytesCities/LoadFromCsv?adsf HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/AwesomeGeography/GeoBytesCities/LoadFromCsv?adsf
Content-Type: multipart/form-data; boundary=---------------------------199122566726299
Content-Length: 354

-----------------------------199122566726299
Content-Disposition: form-data; name="csvFile"; filename="cities_test.html"
Content-Type: text/html

"CityId","CountryID","RegionID","City","Latitude","Longitude","TimeZone","DmaId","Code"
3344,10,1063,"Luj�n de Cuyo","-33.05","-68.867","-03:00",0,"LDCU"
-----------------------------199122566726299--
5
задан Dudeman3000 3 June 2012 в 17:53
поделиться