using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using AwInitilizer.Model; using AwInitilizer.Assist; using System.Collections.Specialized; using System.Globalization; using System.Net; using System.Web; using System.IO; namespace AwInitilizer.Procedure { public class FirmwareBundleUploadProcedure : ProcedureBase { public FirmwareBundleUploadProcedure() : base() { Name = string.Format("Firmware Upload"); Content = string.Format("Upload all Firemware"); } internal override async Task Run() { //wait restart Logger.Print("Waiting restart.."); bool response = false; int pollingCnt = 0; for (pollingCnt = 0; pollingCnt < 56; pollingCnt++) { await Task.Delay(TimeSpan.FromSeconds(15)); response = await ChekCsuBootCompelete(); if (response) break; } //timeout if (pollingCnt >= 56) { Logger.Print("Wait restart timeout", isError: true); InfoLog += "Wait restart timeout\n"; LogPair.Add($"UploadStartWait", "fail"); return false; } LogPair.Add($"UploadStartWait", "0"); //upload firmware var updateList = UpdateData.FirmwareUpdateModels; //open all file stream //List firmwareFileStream = new List(); List UploadFileList = new List(); try { for(int modelIndex = 0;modelIndex < updateList.Count;modelIndex++) //foreach (var model in updateList) { var model = updateList[modelIndex]; var stream = File.Open(model.FirmwareFileName, FileMode.Open); var uploadFile = new UploadFile() { Name = string.Format("files[]", modelIndex + 1), Filename = Path.GetFileName(model.FirmwareFileName), Stream = stream }; UploadFileList.Add(uploadFile); } } catch (Exception e) { InfoLog += $"create file stream failed"; LogPair.Add($"FirmwareUpload", "0"); return false; } //upload try { var uploadResult = await UploadFiles( $"https://{ServerIpAddress}/upgrade_iso_action.php", files: UploadFileList, new NameValueCollection() { {"fw_tag","iso" } } ); var responseStr = Encoding.ASCII.GetString(uploadResult).ToLower(); InfoLog += $"get firmware update response {responseStr}\n"; if (responseStr.Contains("file is uploaded")) return true; return false; } catch { InfoLog += $"file upload failed"; LogPair.Add($"FirmwareUpload", "0"); } LogPair.Add($"FirmwareUpload", "1"); //release all foreach (var uploadFile in UploadFileList) { if(uploadFile!=null && uploadFile.Stream!=null) { uploadFile.Stream.Close(); } } return true; } public async Task UploadFiles(string address, IEnumerable files, NameValueCollection values) { var request = (HttpWebRequest)HttpWebRequest.Create(address); //request.Timeout = 10 * 1000; request.KeepAlive = true; request.Accept = "*/*"; request.Method = "POST"; request.Referer = address; request.Expect = ""; var boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x", NumberFormatInfo.InvariantInfo); request.ContentType = "multipart/form-data; boundary=" + boundary; boundary = "--" + boundary; string sendString = ""; using (var requestStream = request.GetRequestStream()) { // Write the values foreach (string name in values.Keys) { var buffer = Encoding.ASCII.GetBytes(boundary + Environment.NewLine); requestStream.Write(buffer, 0, buffer.Length); buffer = Encoding.ASCII.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"{1}{1}", name, Environment.NewLine)); requestStream.Write(buffer, 0, buffer.Length); buffer = Encoding.ASCII.GetBytes(values[name] + Environment.NewLine); requestStream.Write(buffer, 0, buffer.Length); } // Write the files foreach (var file in files) { var buffer = Encoding.ASCII.GetBytes(boundary + Environment.NewLine); requestStream.Write(buffer, 0, buffer.Length); buffer = Encoding.UTF8.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"{2}", file.Name, file.Filename, Environment.NewLine)); requestStream.Write(buffer, 0, buffer.Length); var ctype = MimeMapping.GetMimeMapping(file.Filename); buffer = Encoding.ASCII.GetBytes(string.Format("Content-Type: {0}{1}{1}", MimeMapping.GetMimeMapping(file.Filename), Environment.NewLine)); requestStream.Write(buffer, 0, buffer.Length); file.Stream.CopyTo(requestStream); buffer = Encoding.ASCII.GetBytes(Environment.NewLine); requestStream.Write(buffer, 0, buffer.Length); } var boundaryBuffer = Encoding.ASCII.GetBytes(boundary + "--"); requestStream.Write(boundaryBuffer, 0, boundaryBuffer.Length); } using (var response = await request.GetResponseAsync()) using (var responseStream = response.GetResponseStream()) using (var stream = new MemoryStream()) { responseStream.CopyTo(stream); return stream.ToArray(); } } } }