0

職場では、ブラウザー側で html 5/javascript を使用し、Web サービスで C# を使用して、Web ページから Web サービスにファイルをアップロードしようとしています。しかし、ある種のエンコーディングには問題があります。

JavaScript に関しては、FileReader の助けを借りてファイルのバイナリ データを取得します。

var file = ... // gets the file from an input
var fileReader = new FileReader();
fileReader.onload = dataRecieved;
fileReader.readAsBinaryString(file);

function dataRecieved() {
  // Here we do a normal jquery ajax post with the file data (fileReader.result).
}

XmlHttpRequest (または同様のもの) の助けを借りずに手動でデータを投稿しているのは、Web ページのさまざまな部分 (関数にラップされている) から Web サービスへの全体的な投稿を簡単にするためです。しかし、それは問題ではないようです。

Web サービスのコードは次のようになります

[WebMethod]
public string SaveFileValueFieldValue(string value)
{
  System.Text.UnicodeEncoding encoder = new UnicodeEncoding();
  byte[] bytes = encoder.GetBytes(value);
  // Saves file from bytes here...
}

すべてが正常に機能し、データは正常に見えますが、ファイル (例として画像) を開こうとすると、開くことができません。非常に基本的なテキスト ファイルは問題ないようです。しかし、画像のような「バイナリ」ファイルをアップロードし、元のバージョンとアップロードされたバージョンの両方を通常のテキスト エディターでメモ帳として開いて違いを確認すると、「見えない」文字がいくつかあるだけで問題があるようです。先頭から数バイト先に改行して表示します。

基本的に、ファイルは変換のどこかで数バイト間違ってエンコードされているようです。

また、データからjavascriptでint配列を作成しようとしましたが、Webサービスでbyte []に​​変換しましたが、まったく同じ問題がありました。Unicode 以外 (UTF-8 など) で変換しようとすると、元のデータとはまったく異なるデータになるため、ここでは正しい軌道に乗っていると思いますが、少し間違っています。

4

1 に答える 1

2

リクエスト自体はテキストであるため、間違ったenc-typeを送信すると、バイナリデータは失われます。できることは、バイナリをbase64にエンコードし、反対側でデコードすることです。
enc-typeをmulti-part/mixedに変更し、境界を設定するには(電子メールなどのように)、自分でリクエストを組み立てる必要があります。

于 2012-09-18T14:58:23.360 に答える