5

C# のuploadDataメソッドは、送信されるデータをエンコードしません。したがって、このメソッドを使用して (バイトに変換した後に) ファイルを送信すると、受信側が投稿を探している場合、multiform/form-data明らかに機能しません。次のようなヘッダーを追加します。

WebClient c = new WebClient();
c.Headers.Add("Content-Type", "multipart/form-data");

マルチフォームとして暗号化されたデータを送信するようにしますか、それともデータはまだ暗号化されません (したがって、マルチフォーム データを期待するサーバーでは解析できません) ?

WebClient's uploadFileクライアント側でファイルパスの場所を取得する権限がないため、使用できないことに注意してください(バイトに変換できるストリームがあるだけです)

4

1 に答える 1

6

UploadFileセキュリティを確保したい場合は、https 経由で WebClientを使用してみませんか? これにより、追加が自動的に処理されますmultipart/form-data

使用例UploadFile

http://msdn.microsoft.com/en-us/library/36s52zhs.aspx

もう1つ、エンコードと暗号化は2つの異なるものです。

編集:

WebClient プロジェクトで WebClient を使用している場合は、質問に Silverlight のタグを付ける必要があります。とにかく、SL の WebClient クラスには UploadData メソッドがありません。詳細については、これを参照してください。

http://msdn.microsoft.com/en-us/library/system.net.webclient%28v=vs.95%29.aspx

とにかく、これがあなたの問題に対する実用的な解決策です:

ボタンのクリックで、次のコードを使用します。

OpenFileDialog dialog = new OpenFileDialog();
            bool? retVal = dialog.ShowDialog();
            if (retVal.HasValue && retVal == true)
            {
                using (Stream stream = dialog.File.OpenRead())
                {
                    MemoryStream memoryStream = new MemoryStream();
                    stream.CopyTo(memoryStream);
                    WebClient webClient = new WebClient();
                    webClient.Headers["Content-type"] = "multipart/form-data; boundary=---------------------------" + _boundaryNo;
                    webClient.OpenWriteAsync(new Uri("http://localhost:1463/Home/File", UriKind.Absolute), "POST", new { Stream = memoryStream, FileName = dialog.File.Name });
                    webClient.OpenWriteCompleted += new OpenWriteCompletedEventHandler(webClient_OpenWriteCompleted);
                }
            } 

そしてイベント自体:

void webClient_OpenWriteCompleted(object sender, OpenWriteCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                Stream responseStream = e.Result as Stream;                
                dynamic obj = e.UserState;
                MemoryStream memoryStream = obj.Stream as MemoryStream;
                string fileName = obj.FileName;
                if (responseStream != null && memoryStream != null)
                {
                    string headerTemplate = string.Format("-----------------------------{0}\r\n", _boundaryNo);

                    memoryStream.Position = 0;
                    byte[] byteArr = memoryStream.ToArray();
                    string data = headerTemplate + string.Format("Content-Disposition: form-data; name=\"pic\"; filename=\"{0}\"\r\nContent-Type: application/octet-stream\r\n\r\n", fileName);
                    byte[] header = Encoding.UTF8.GetBytes(data);
                    responseStream.Write(header, 0, header.Length);

                    responseStream.Write(byteArr, 0, byteArr.Length);
                    header = Encoding.UTF8.GetBytes("\r\n");
                    responseStream.Write(byteArr, 0, byteArr.Length);

                    byte[] trailer = System.Text.Encoding.UTF8.GetBytes(string.Format("-----------------------------{0}--\r\n", _boundaryNo));
                    responseStream.Write(trailer, 0, trailer.Length);                    
                }
                memoryStream.Close();
                responseStream.Close();
            }
        }

ここで、_boundaryNo はprivate string _boundaryNo = DateTime.Now.Ticks.ToString("x");

Asp.Net MVC 4 および Silverlight 5 で動作させました。

幸運を :)

于 2012-10-08T16:31:14.527 に答える