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--
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
# 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
@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