0

ASP.NETMVC3コントローラーアクションがあります。そのアクションは次のように定義されます。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(string parameter1, HttpPostedFileBase uploadFile)
{
  if (parameter1 == null)
    return Json(new { status = "Error" }, JsonRequestBehavior.AllowGet);

  if (uploadFile.ContentLength == 0)
    return Json(new { status = "Error" }, JsonRequestBehavior.AllowGet);

  return Json(new { status = "Success" }, JsonRequestBehavior.AllowGet);
}

C#アプリを介してこのエンドポイントにアップロードする必要があります。現在、私は以下を使用しています:

public void Upload()
{
  WebRequest request = HttpWebRequest.Create("http://www.mydomain.com/myendpoint");
  request.Method = "POST";
  request.ContentType = "multipart/form-data";
  request.BeginGetRequestStream(new AsyncCallback(UploadBeginGetRequestStreamCallBack), request);
}

private void UploadBeginGetRequestStreamCallBack(IAsyncResult ar)
{
  string json = "{\"parameter1\":\"test\"}";

  HttpWebRequest webRequest = (HttpWebRequest)(ar.AsyncState);
  using (Stream postStream = webRequest.EndGetRequestStream(ar))
  {
    byte[] byteArray = Encoding.UTF8.GetBytes(json);
    postStream.Write(byteArray, 0, byteArray.Length);
    postStream.Close();
  }
  webRequest.BeginGetResponse(new AsyncCallback(Upload_Completed), webRequest);
}

private void Upload_Completed(IAsyncResult result)
{
  WebRequest request = (WebRequest)(result.AsyncState);
  WebResponse response = request.EndGetResponse(result);
  // Parse response
}

200を取得している間、ステータスは常に「エラー」です。さらに掘り下げてみると、parameter1が常にnullであることに気付きました。少し混乱しています。誰かが、WebRequestを介してコードからparameter1のデータとファイルをプログラムで送信する方法を教えてもらえますか?

ありがとうございました!

4

1 に答える 1

2

おい、これは難しかった!

プログラムでMVCアクションにファイルをアップロードする方法を実際に見つけようとしましたが、できませんでした。申し訳ありません。私が見つけた解決策は、ファイルをバイト配列に変換し、それを文字列にシリアル化します。

ここで、見てみましょう。

これはあなたのコントローラーアクションです:

    [AcceptVerbs(HttpVerbs.Post)]
            public ActionResult uploadFile(string fileName, string fileBytes)
            {
                if (string.IsNullOrEmpty(fileName) || string.IsNullOrEmpty(fileBytes))
                    return Json(new { status = "Error" }, JsonRequestBehavior.AllowGet);
    
                string[] byteToConvert = fileBytes.Split('.');
                List<byte> fileBytesList = new List<byte>();
    byteToConvert.ToList<string>()
            .Where(x => !string.IsNullOrEmpty(x))
            .ToList<string>()
            .ForEach(x => fileBytesList.Add(Convert.ToByte(x)));
    
                //Now you can save the bytes list to a file
                
                return Json(new { status = "Success" }, JsonRequestBehavior.AllowGet);
            }

そしてこれはクライアントコード(ファイルを投稿する人)です:

public void Upload()
        {
            WebRequest request = HttpWebRequest.Create("http://localhost:7267/Search/uploadFile");
            request.Method = "POST";
            //This is important, MVC uses the content-type to discover the action parameters
            request.ContentType = "application/x-www-form-urlencoded";

            byte[] fileBytes = System.IO.File.ReadAllBytes(@"C:\myFile.jpg");

            StringBuilder serializedBytes = new StringBuilder();
            
            //Let's serialize the bytes of your file
            fileBytes.ToList<byte>().ForEach(x => serializedBytes.AppendFormat("{0}.", Convert.ToUInt32(x)));

            string postParameters = String.Format("fileName={0}&fileBytes={1}", "myFile.jpg", serializedBytes.ToString());

            byte[] postData = Encoding.UTF8.GetBytes(postParameters);
            
            using (Stream postStream = request.GetRequestStream())
            {
                postStream.Write(postData, 0, postData.Length);
                postStream.Close();
            }

            request.BeginGetResponse(new AsyncCallback(Upload_Completed), request);
        }

        private void Upload_Completed(IAsyncResult result)
        {
            WebRequest request = (WebRequest)(result.AsyncState);
            WebResponse response = request.EndGetResponse(result);
            // Parse response
        }

ハンゼルマンは、あなたの場合ではない、ウェブインターフェースからのファイルアップロードに関して良い投稿をしています。

バイト配列をファイルに戻すためのヘルプが必要な場合は、次のスレッドを確認してください。Byte []配列をC#でファイルに書き込むことはできますか?

お役に立てれば。

誰かがより良い解決策を持っているなら、私はそれを見てみたいと思います。

よろしく、カリル

于 2012-06-28T02:35:35.830 に答える