目標:ワットの.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--
SQL Serverデータベースを使用していますか?照合順序を確認してください。詳細については、[こちら](http://msdn.microsoft.com/en-us/library/ms144250(v = sql.105).aspx)を参照してください。 – lucask
#1は私が働くと思います。もしそうでなければ、ネットワークスニファ(またはおそらくFiddler)をチェックして、正しいバイトがそれをサーバーに送信していることを確認します。 – Gabe
@lucask - MS SQL Serverインポートウィザードを使用すると、UTF-8文字がデータベースに格納されるため、データベースではありません。 ?文字はC#の値に存在するので、db挿入の前にあります。 – Dudeman3000