2012-06-03 9 views
5

目標:ワットの.Netマルチパート/フォームデータフォームのenctypeとUTF-8 "特別な" 文字=>(MVCワット/ HttpPostedFileBase)

アップロード/ポストCSVファイル/ MVCアクションにUTF-8文字データを読み込んでデータベーステーブルに貼り付けます。

問題:

プレーンテキスト文字のみが通過します。 áのようなUTF-8の "特殊"文字は、コードとデータベースで、この文字=> renderとしてレンダリングされません。

より:

私は、以下の重要な部分を含めましたが、これは私のC#のコードに問題はないことを確信しています。

は、私はこの問題は、アップロードされたファイルは、プレーンテキストまたは「プレーン/テキスト」MIMEタイプをエンコードされたと思ったが、私は、ファイルの拡張子を変更することにより、.htmlのためにすることを変更することができました

概要:

投稿されたファイルのUTF-8文字を正しく解釈するために、enctype属性が "multipart/form-data"に設定されたフォームを取得するにはどうすればよいですか?

研究:

私の研究から、これは一般的で透明な溶液をせずに共通の問題であるように思われます。

私は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拡張子を持っているとき、私は.txtファイルからのファイルの拡張子を変更すると、HttpPostedFileBaseのContentTypeプロパティは "text/plainの"

です。csv HttpPostedFileBaseのContentTypeプロパティが "application/vnd.ms-excel"

ファイル拡張子を.htmlに変更すると、HttpPostedFileBaseのContentTypeプロパティは "text/html"になります。勝者になるが、そうではなかった。


私の魂では、この問題を簡単に解決できると信じています。私は自分自身でこれを理解することができなかったことを驚かせています。ファイルにUTF-8文字をアップロードすることは一般的な作業です!なぜ私はここに失敗していますか?

おそらく私はIISのウェブサイトのMIMEタイプを調整する必要がありますか?

おそらく別のDOCTYPE/htmlタグ/メタタグが必要ですか?


@Gabe -

はここに私のポストはシオマネキのように見えるものです。これは本当に面白いです。なぜなら、 は平日で、ポスト値のところにあるからです。

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

SQL Serverデータベースを使用していますか?照合順序を確認してください。詳細については、[こちら](http://msdn.microsoft.com/en-us/library/ms144250(v = sql.105).aspx)を参照してください。 – lucask

+0

#1は私が働くと思います。もしそうでなければ、ネットワークスニファ(またはおそらくFiddler)をチェックして、正しいバイトがそれをサーバーに送信していることを確認します。 – Gabe

+0

@lucask - MS SQL Serverインポートウィザードを使用すると、UTF-8文字がデータベースに格納されるため、データベースではありません。 ?文字はC#の値に存在するので、db挿入の前にあります。 – Dudeman3000

答えて

2

上記の情報に基づいて、問題はファイルコード自体ではなく、コードではないと推測します。私はこれを証明するための簡単なテスト走っ

  1. を私は特殊文字を含むExcelからの単純なCSVファイルをエクスポートします。

  2. 次に、以下のフォームとアクションメソッドでアップロードしました。

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

フォーム

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

対処方法は、私はこのケースでは、あなたと同じ問題を抱えていた - 特殊文字が置き換えられました。

メモ帳でファイルを開いたときに特殊文字が正しく表示されていたため、ファイルの問題にはならないようでしたが、[名前を付けて保存]ダイアログを開いたときに、 。私はそれをUTF-8に切り替えて保存し、アップローダを介して実行し、すべて正常に動作しました。

+0

Googleドキュメントを使用して、ファイルをUTF-8に変換することもできます:http://stackoverflow.com/questions/4221176/excel-to-csv-with-utf8-encoding/4221256#4221256 –

2

私は同じ問題を抱えている、あなたは

のStreamReaderリーダー=新しいStreamReaderを(archivo_origen.InputStream、Encoding.GetEncoding( "ISO-8859-1"))を使用することができます。

、それは仕事、 "ISO-8859-1" はラテン語派生言語のためにあるような、スペイン語、アレマン、フランシス

+0

期待されるように、UTF-8でエンコードされたファイルではありません。 –

関連する問題