2016-02-10 46 views
3

我需要上传csv文件并解析它。 我可以看到在HTTP主体请求文件,但是当我通过它在csvreader我能看到的base64字符串像头: enter image description here如何上传csv文件并解析它?

在客户端我用angularjs:

'uploadBulkUsersFile': { 
       method: 'POST', url: CONFIG.apiServiceBaseUri + "api/users/bulkUsers", 
       headers: { 
        "Content-Type": undefined 
       }, 
       transformRequest: angular.identity, 
       withCredentials: true 
      }, 

,并呼吁:

var _uploadBulkUsersFile = function (bulkUsersFile) { 
    var fd = new FormData(); 
    fd.append("file", bulkUsersFile); 

    return usersResource.uploadBulkUsersFile({}, fd, function (result) { 
     return result; 
    }).$promise; 
}; 

,并在服务器端我用webapi2:

if (!Request.Content.IsMimeMultipartContent()) 
     throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 

    var provider = new MultipartMemoryStreamProvider(); 
    await Request.Content.ReadAsMultipartAsync(provider); 
    foreach (var file in provider.Contents) 
    { 
     var buffer = await file.ReadAsStreamAsync(); 

     TextReader textReader = new StreamReader(buffer); 
     var csv = new CsvReader(textReader); 
     var records = csv.GetRecords<BulkUploadUser>().ToList(); 

     return Created("DefaultApi", records); 
    } 

http请求有效负载

------ WebKitFormBoundarySKPlgJRINOMnpxVP Content-Disposition:form-data; NAME = “文件”

data:application/vnd.ms-excel;base64,RW1haWwsRmlyc3ROYW1lLExhc3ROYW1lDQpwcm9zdG8uZHVkYUBnbWFpbC5jb20yLERlbmlzLER1ZGFpZXYNCnByb3N0by5kdWRhQGdtYWlsLmNvbSxEZW5pcyxEdWRhaWV2DQpwcm9zdG8uZHVkYUBnbWFpbC5jb20yLERlbmlzLER1ZGFpZXYNCg== 
------WebKitFormBoundarySKPlgJRINOMnpxVP-- 

UPDATE

@Ubercode建议我基地64转换为字符串,我做到了,但看起来很恶心:

var buffer = await file.ReadAsStreamAsync(); 

TextReader textReader = new StreamReader(buffer); 
var text = textReader.ReadToEnd(); 
var indexOfWord = "base64,"; 
var base64EncodedBytes = System.Convert.FromBase64String(text.Substring(text.IndexOf(indexOfWord) + indexOfWord.Length)); 
var encoded = System.Text.Encoding.UTF8.GetString(base64EncodedBytes); 
TextReader textReader2 = new StringReader(encoded); 
var csv = new CsvReader(textReader2); 
var records = csv.GetRecords<BulkUploadUser>().ToList(); 
+0

您正在上传的文件看起来像一个实际的“excel文件”,而不是“csv文件”,它应该只是纯文本。 – Nkosi

+0

什么是您正在上传的文件的文件扩展名? – Nkosi

+0

@Nkosi csv扩展 – Mediator

回答

1

你需要将base64编码的内容解码到您的文件中:

How do I encode and decode a base 64 string

你可以整理你的代码了这样一点:

string text; 
using(TextReader textReader = new StreamReader(buffer)) 
    text = textReader.ReadToEnd(); 

CsvReader csv; 

using(var ms 
    = new MemoryStream(Convert.FromBase64String(text.Substring(text.IndexOf(',') + 1))) 
using (var textReader2 = new StreamReader(ms)) 
    csv = new CsvReader(textReader2); 

var records = csv.GetRecords<BulkUploadUser>().ToList(); 
+0

这是帮助,但看起来非常恶心,我更新了我的代码 – Mediator

0
 if (!Request.Content.IsMimeMultipartContent()) 
     { 
      return StatusCode(HttpStatusCode.UnsupportedMediaType); 
     } 

     HttpPostedFile uploadedFile = HttpContext.Current.Request.Files[0]; 

     var csv = new CsvReader(uploadedFile.InputStream); 
+0

HttpContext.Current.Request.Files为空 – Mediator

0

上传的数据确实是CSV,不擅长:

Email,FirstName,LastName 
[email protected],Denis,Dudaiev 
[email protected],Denis,Dudaiev 
[email protected],Denis,Dudaiev 

这将是最好的,以防止数据被转换到base64首先(它更大,需要解码)。

出于某种原因,该数据被发送为'Excel的和用base64:

data:application/vnd.ms-excel;base64, 

所以,你可能要检查以下内容:

headers: { 
    "Content-Type": undefined 
}, 
transformRequest: angular.identity, 

我不知道AngularJS,但您可能需要将Content-Type更改为text/csv并检查transformRequest

或者,也许它就会转化为这里的base64:

var fd = new FormData(); 
fd.append("file", bulkUsersFile); 

因此,这将是最好的检查,其中数据被转换并修复它来发送纯文本代替。这将阻止编码/解码步骤,并且数据也会变小。