Obiettivo:.Net multipart/form-data forma enctype e UTF-8 caratteri "speciali" => (MVC w/HttpPostedFileBase)
Upload/file CSV posta w/caratteri UTF-8 a un'azione MVC , leggi i dati e incollali in una tabella di database.
Problema:
Solo i caratteri di testo normale farcela. I caratteri "speciali" UTF-8 come á non vengono correttamente, nel codice e nel database che visualizzano come questo carattere => .
Più:
Sono convinto che questo non è un problema con il mio codice C#, anche se ho incluso le parti più importanti di seguito.
ho pensato che il problema è stato che il file caricato viene codificato un testo normale o "/ plain text" tipo MIME, ma sono stato in grado di cambiare la situazione, cambiando l'estensione del file in .html
Sommario:
Come si ottiene un modulo con un attributo enctype impostato su "multipart/form-data" per interpretare correttamente i caratteri UTF-8 in un file inviato?
di ricerca:
Dalla mia ricerca questo sembra essere un problema comune, senza una soluzione comune e chiaro.
Ho trovato più soluzioni per java e PHP di .Net pure.
variabile csvfile è di tipo HttpPostedFileBase
questa è la firma azione MVC
[HttpPost]
public ActionResult LoadFromCsv(HttpPostedFileBase csvFile)
Le cose che ho provato:
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)
Quando il file ha estensione .txt, la proprietà ContentType della HttpPostedFileBase è "text/plain"
Quando cambio l'estensione del file da .txt a.csv la proprietà ContentType di HttpPostedFileBase è "application/vnd.ms-excel"
Quando cambio l'estensione del file in .html, la proprietà ContentType di HttpPostedFileBase è "text/html" - ho pensato che questo avrebbe essere un vincitore, ma non lo era.
Nella mia anima devo credere che ci sia una soluzione facile a questo problema. Mi sorprende che non sia stato in grado di capirlo da solo, il caricamento di caratteri UTF-8 in un file è un compito comune! Perché sto fallendo qui?!?!
Forse devo regolare i tipi di mime in IIS per il sito web?
Forse ho bisogno di tag/meta tag diversi DOCTYPE/html?
@Gabe -
Ecco quello che il mio post assomiglia a violinista. Questo è davvero interessante perché il è chiaro come il giorno, proprio lì nel valore del post.
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--
Stai utilizzando database di SQL Server? Controlla le sue regole di confronto. Puoi saperne di più a riguardo [qui] (http://msdn.microsoft.com/en-us/library/ms144250 (v = sql.105) .aspx). – lucask
# 1 è quello che penserei avrebbe funzionato. In caso contrario, controllerei uno sniffer di rete (o forse Fiddler) per verificare che i byte corretti stiano raggiungendo il server. – Gabe
@lucask: quando utilizzo il wizard di importazione SQL server SQL i caratteri UTF-8 lo inseriscono nel database, quindi non è il database. Il ?il carattere è presente nei valori C#, quindi è lì prima dell'inserto db. – Dudeman3000