2012-06-03 14 views
5

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-- 
+0

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

+0

# 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

+0

@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

risposta

2

Sulla base delle informazioni fornite, direi che il problema è con il file di codifica in sé - non con il vostro codice.

ho eseguito una semplice test per dimostrare questo:

  1. ho esportato un semplice file CSV da Excel contenente caratteri speciali.

  2. Quindi, l'ho caricato tramite il seguente modulo e metodo di azione.

Modulo

<form method="post" action="@Url.Action("UploadFile", "Home")" enctype="multipart/form-data"> 
    <input type="file" id="file" name="file" /> 
    <input type="submit" /> 
</form> 

metodo d'azione

[HttpPost] 
public ActionResult UploadFile(HttpPostedFileBase file) 
{ 
    using (StreamReader reader = new StreamReader(file.InputStream, System.Text.Encoding.UTF8)) 
    { 
     string text = reader.ReadToEnd(); 
    } 

    return RedirectToAction("Index"); 
} 

Ho avuto lo stesso problema come voi in questo caso - i caratteri speciali sono stati sostituiti con.

Ho aperto il file in Blocco note ei caratteri speciali erano visualizzati correttamente lì, quindi sembrava che non potesse essere un problema di file, ma quando ho aperto la finestra di dialogo "Salva con nome", la codifica selezionata era "ANSI" . L'ho cambiato in UTF-8 e l'ho salvato, l'ho scaricato attraverso l'uploader e tutto ha funzionato bene.

+0

Puoi anche utilizzare Google Documenti per trasformare il file in UTF-8: http://stackoverflow.com/questions/4221176/excel-to-csv-with-utf8-encoding/4221256#4221256 –

2

Ho lo stesso problema, è possibile utilizzare

lettore di StreamReader = new StreamReader (archivo_origen.InputStream, Encoding.GetEncoding ("iso-8859-1"));

e farlo funzionare, "iso-8859-1" è per la lingua latina derivati ​​come, spagnolo, Aleman, frances

+0

I.e. non è un file con codifica UTF-8 come previsto dall'OP. –