2012-06-03 13 views
5

Mục tiêu:Net multipart/form-data dạng enctype và UTF-8 "đặc biệt" nhân vật => (MVC w/HttpPostedFileBase)

Tải lên/bài CSV w/UTF-8 ký tự đến một hành động MVC , đọc dữ liệu và dán nó vào một bảng cơ sở dữ liệu.

Sự cố:

Chỉ các ký tự văn bản thuần tuý thông qua. Các ký tự "đặc biệt" UTF-8 như á không đi qua chính xác, trong mã và trong cơ sở dữ liệu mà chúng biểu hiện dưới dạng ký tự này => .

Thêm:

Tôi tin rằng đây không phải là vấn đề với mã C# mặc dù tôi đã bao gồm các phần quan trọng bên dưới.

Tôi nghĩ vấn đề đã được rằng các tập tin được tải lên được mã hóa một văn bản đơn giản hoặc "đồng bằng/text" kiểu MIME, nhưng tôi đã có thể thay đổi điều đó bằng cách thay đổi phần mở rộng tập tin để .html

Tóm tắt:

Làm cách nào để bạn nhận được biểu mẫu có thuộc tính enctype được đặt thành "multipart/form-data" để diễn giải chính xác các ký tự UTF-8 trong tệp được đăng?

Nghiên cứu:

Từ nghiên cứu của tôi, đây dường như là vấn đề phổ biến mà không có giải pháp thông thường và rõ ràng.

Tôi đã tìm thấy nhiều giải pháp hơn cho java và PHP so với .Net.


  • csvFile biến là loại HttpPostedFileBase

  • đây là chữ ký hành động MVC

[HttpPost]

public ActionResult LoadFromCsv(HttpPostedFileBase csvFile)


Những điều tôi đã cố gắng:

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)

Khi các tập tin có phần mở rộng .txt, tài sản của HttpPostedFileBase ContentType là "text/plain"

Khi tôi thay đổi phần mở rộng tập tin từ .txt để.csv thuộc tính ContentType của HttpPostedFileBase là "application/vnd.ms-excel"

Khi tôi thay đổi phần mở rộng tệp thành .html, thuộc tính ContentType của HttpPostedFileBase là "text/html" - tôi nghĩ điều này sẽ là người chiến thắng, nhưng không phải vậy.


Trong linh hồn, tôi phải tin rằng có một giải pháp dễ dàng cho vấn đề này. Điều làm tôi ngạc nhiên là tôi không thể tự mình hình dung ra điều này, việc tải lên các ký tự UTF-8 trong một tệp là một nhiệm vụ phổ biến! Tại sao tôi thất bại ở đây?!?!

Có lẽ tôi phải điều chỉnh loại mime trong IIS cho trang web?

Có lẽ tôi cần thẻ DOCTYPE/html/thẻ meta khác nhau?


@Gabe -

Đây là những gì bài viết của tôi trông như thế nào trong cáy. Điều này thực sự thú vị bởi vì là đơn giản như ngày, ngay trong giá trị bài đăng.

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

Bạn đang sử dụng cơ sở dữ liệu SQL Server? Kiểm tra collation của nó. Bạn có thể tìm hiểu thêm về nó [ở đây] (http://msdn.microsoft.com/en-us/library/ms144250 (v = sql.105) .aspx). – lucask

+0

# 1 là điều tôi nghĩ sẽ hoạt động. Nếu nó không, tôi sẽ kiểm tra một sniffer mạng (hoặc có thể Fiddler) để xác minh rằng các byte quyền được làm cho nó lên đến máy chủ. – Gabe

+0

@lucask - khi tôi sử dụng trình hướng dẫn nhập máy chủ MS sql, các ký tự UTF-8 biến nó thành cơ sở dữ liệu, vì vậy nó không phải là cơ sở dữ liệu. Các ?ký tự có mặt trong các giá trị C#, vì vậy nó có trước khi chèn db. – Dudeman3000

Trả lời

2

Dựa trên thông tin được cung cấp, tôi cho rằng vấn đề là với mã hóa tệp - không phải với mã của bạn.

Tôi chạy một thử nghiệm đơn giản để chứng minh điều này:

  1. tôi đã xuất tệp csv đơn giản từ Excel có chứa ký tự đặc biệt.

  2. Sau đó, tôi đã tải nó lên thông qua hình thức và phương thức hành động sau.

Mẫu

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

phương pháp hành động

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

    return RedirectToAction("Index"); 
} 

tôi đã có vấn đề tương tự như bạn trong trường hợp này - những nhân vật đặc biệt đã được thay thế bằng.

Tôi đã mở tệp trong Notepad và các ký tự đặc biệt được hiển thị chính xác ở đó, vì vậy dường như không thể là sự cố tệp, nhưng khi tôi mở hộp thoại "Lưu dưới dạng", mã hóa đã chọn là "ANSI" . Tôi chuyển nó sang UTF-8 và lưu nó, chạy nó thông qua người tải lên, và tất cả đều hoạt động tốt.

+0

Bạn cũng có thể sử dụng Google Documents để chuyển đổi tệp thành UTF-8: http://stackoverflow.com/questions/4221176/excel-to-csv-with-utf8-encoding/4221256#4221256 –

2

Tôi có cùng một vấn đề, bạn có thể sử dụng

đọc StreamReader = StreamReader mới (archivo_origen.InputStream, Encoding.GetEncoding ("iso-8859-1"));

và hoạt động "iso-8859-1" dành cho ngôn ngữ có nguồn gốc từ latin như, Tiếng Tây Ban Nha, aleman, frances

+0

I.e. nó không phải là tệp được mã hóa UTF-8 như OP mong đợi. –

Các vấn đề liên quan