C#のアプリケーションからPOSTでデータを送り、PHPで受け取りたいです。
PHP側は$_POST['name']
と$_FILES['file']
で受け取ります。
こちらのサイトを参考に書きましたが、
nameとfileが両方とも$_POSTに入ってしまっていました。
var_dump($_POST)
すると、$_POST['file']
にはバイナリデータが入っていたので、送信自体は出来ているようです。
_FILESで受け取るにはどうすればよいでしょうか。
(呼び出し側)
C#
1var content = new Dictionary<string, string>() 2{ 3 { "name", tbName.Text } 4}; 5 6var files = new Dictionary<string, string>() 7{ 8 { "file", SelectedFile } 9}; 10var res = PostAPI("music/create/", content, files, Settings.token);
(メソッド)
C#
1public static string PostAPI(string url, Dictionary<string, string> nameValue, Dictionary<string, string> files, string token) 2{ 3 var enc = Encoding.GetEncoding("utf-8"); 4 var boundary = Environment.TickCount.ToString(); 5 6 var req = (HttpWebRequest)WebRequest.Create(REQUEST_URL + "/" + url); 7 req.Method = "POST"; 8 req.ContentType = "multipart/form-data; boundary=" + boundary; 9 req.Headers.Add("Token", token); 10 11 var postData = ""; 12 foreach(string key in nameValue.Keys) 13 { 14 postData += "--" + boundary + "\r\n" + 15 "Content-Disposition: form-data; name=\"" + key + "\"\r\n\r\n" + nameValue[key] + "\r\n"; 16 } 17 foreach(string key in files.Keys) 18 { 19 var filename = Path.GetFileName(files[key]); 20 postData += "--" + boundary + "\r\n" + 21 "Content-Disposition: form-data; name=\"" + key + "\" filename=\"" + filename + "\"\r\n"; 22 } 23 postData += 24 "Content-Type: application/octet-stream\r\n" + 25 "Content-Transfer-Encoding: binary\r\n\r\n"; 26 27 byte[] startData = enc.GetBytes(postData); 28 postData = "\r\n--" + boundary + "--\r\n"; 29 byte[] endData = enc.GetBytes(postData); 30 31 long fsLength = 0; 32 var fileStreams = new FileStream[files.Keys.Count]; 33 int count = 0; 34 foreach (string key in files.Keys) 35 { 36 var filestream = new FileStream(files[key], FileMode.Open, FileAccess.Read); 37 fileStreams[count] = filestream; 38 fsLength += filestream.Length; 39 count++; 40 } 41 42 req.ContentLength = startData.Length + endData.Length + fsLength; 43 44 var reqStream = req.GetRequestStream(); 45 reqStream.Write(startData, 0, startData.Length); 46 foreach (FileStream fs in fileStreams) 47 { 48 var readData = new byte[0x1000]; 49 int readSize; 50 while (true) 51 { 52 readSize = fs.Read(readData, 0, readData.Length); 53 if (readSize == 0) 54 break; 55 reqStream.Write(readData, 0, readSize); 56 } 57 fs.Close(); 58 } 59 reqStream.Write(endData, 0, endData.Length); 60 reqStream.Close(); 61 62 var res = (HttpWebResponse)req.GetResponse(); 63 StreamReader sr = new StreamReader(res.GetResponseStream(), enc); 64 var resText = sr.ReadToEnd(); 65 sr.Close(); 66 return resText; 67}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。