7

ゴール:

UTF-8 文字を含む CSV ファイルを MVC アクションにアップロード/投稿し、データを読み取り、データベース テーブルに貼り付けます。

問題:

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

もっと:

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

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

概要:

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

リサーチ:

私の調査によると、これは一般的で明確な解決策がない一般的な問題のようです。

.Net よりも Java と PHP のソリューションも多く見つけました。


  • 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 の場合、HttpPostedFileBase の ContentType プロパティは "text/plain" です。

ファイル拡張子を .txt から .csv に変更すると、HttpPostedFileBase の ContentType プロパティは "application/vnd.ms-excel" になります。

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


私の魂では、この問題には簡単な解決策があると信じなければなりません。ファイルに UTF-8 文字をアップロードするのは一般的な作業です。なぜ私はここで失敗するのですか?!?!

Web サイト用に IIS で MIME タイプを調整する必要があるのではないでしょうか?

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


@ゲイブ -

これが私の投稿がフィドラーでどのように見えるかです。これは非常に興味深いことです。なぜなら、これは日付のように明白で、ポスト値のすぐそばにあるからです。

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--
4

2 に答える 2

4

私は同じ問題を抱えています、あなたは使うことができます

StreamReader リーダー = 新しい StreamReader(archivo_origen.InputStream, Encoding.GetEncoding("iso-8859-1"));

「iso-8859-1」は、スペイン語、エールマン、フランシスなどのラテン系言語用です。

于 2012-11-20T19:30:39.130 に答える
3

与えられた情報に基づいて、問題はコードではなく、ファイルのエンコード自体にあると思います。

これを実証するために簡単なテストを実行しました。

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

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

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

アクション方法

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

    return RedirectToAction("Index");
}

この場合、私はあなたと同じ問題を抱えていました-特殊文字が�に置き換えられました.

ファイルをメモ帳で開くと特殊文字が正しく表示されていたので、ファイルの問題ではなさそうでしたが、「名前を付けて保存」ダイアログを開いたところ、選択されたエンコーディングが「ANSI」でした。UTF-8 に切り替えて保存し、アップローダーで実行したところ、問題なく動作しました。

于 2012-09-23T17:28:45.387 に答える