4

csvファイルをアップロードして解析する必要があります。http body リクエストでファイルを確認できますが、csvreader で渡すと、ヘッダーのような base64 文字列が表示されます。 ここに画像の説明を入力

クライアント側では、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 コンテンツの気質: フォーム データ。名前="ファイル"

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

アップデート

@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();
4

4 に答える 4

1

base64 でエンコードされたものをファイルにデコードする必要があります。

Base 64 文字列をエンコードおよびデコードする方法

次のように、コードを少し整理できます。

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();
于 2016-02-10T07:38:43.797 に答える
0
        if (!Request.Content.IsMimeMultipartContent())
        {
            return StatusCode(HttpStatusCode.UnsupportedMediaType);
        }

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

         var csv = new CsvReader(uploadedFile.InputStream);
于 2016-02-10T07:38:27.250 に答える
0

アップロードされたデータは実際には csv であり、Excel ではありません。

Email,FirstName,LastName
prosto.duda@gmail.com2,Denis,Dudaiev
prosto.duda@gmail.com,Denis,Dudaiev
prosto.duda@gmail.com2,Denis,Dudaiev

そもそもデータが base64 に変換されないようにするのが最善でしょう (サイズが大きく、デコードが必要です)。

何らかの理由で、データは「Excel」として送信され、base64 で送信されます。

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

したがって、おそらく次のことを確認する必要があります。

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

AngularJS はわかりませんが、 に変更Content-Typetext/csvて確認するとよいでしょうtransformRequest

または、ここでbase64に変換されるかもしれません:

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

そのため、データが変換される場所を確認し、代わりにプレーン テキストを送信するように修正することをお勧めします。これにより、エンコード/デコードのステップが妨げられ、データも小さくなります。

于 2016-02-10T15:27:40.513 に答える