using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Http; using System.Text; using Cysharp.Threading.Tasks; using Newtonsoft.Json; using Runtime; using UnityEngine; using UnityEngine.Networking; namespace HK.FUJIFILM { public class NetworkManager : MonoManager { private string baseURL { get { return "http://3.109.226.137/api/createOrder"; } } public void Upload(Action callback) { StartCoroutine(StartUpload(callback)); } IEnumerator StartUpload(Action callback) { // yield return StartCoroutine(UploadPicture(null)); // yield break; var shoppingCart = ShoppingCartManager.Instance.ShoppingCart; yield return StartCoroutine(UploadOrder(shoppingCart.datas.Values.ToList(), "", shoppingCart.userName, shoppingCart.userModie, "fdsa@gmail.com", "dfsa", shoppingCart.orderID, "", "", "", "Fujifilm", "Fujifilm", "123", "", callback)); } private IEnumerator UploadOrder(List cartItems, string date, string name, string phone, string email, string address, string orderid, string orderStatus, string credit_card_number, string transaction_id, string order_location, string location_kiosk, string payment_method, string order_status, Action callback) { WWWForm form = new WWWForm(); //customer_name = "default name"; //customer_phone = "default phone"; form.AddField("client_name", name); form.AddField("client_phone", phone); form.AddField("client_email", email); form.AddField("payment_method", payment_method); form.AddField("credit_card", credit_card_number); form.AddField("transaction_id", transaction_id); form.AddField("order_location", order_location); form.AddField("location_kiosk", location_kiosk); form.AddField("client_delivery_address", address); form.AddField("member_id", orderid); form.AddField("eshop_order_created", date); form.AddField("order_status", order_status); for (int i = 0; i < cartItems.Count; i++) { int price = cartItems[i].bookAmount; string productName = $"{cartItems[i].bookName}"; //if (cartItems[i].IsLivePrint) // productName += " live print"; productName = productName.Replace('\n', ' '); //if (cartItems[i].IsLivePrint) // productName += " live print**"; form.AddField("product_name[" + i + "]", productName); if (productName.Length < 45) form.AddField("product_category[" + i + "]", productName); else form.AddField("product_category[" + i + "]", productName.Substring(0, 45)); //form.AddField("product_color[" + i + "]", cartItems[i].typedWords); form.AddField("product_price[" + i + "]", price); form.AddField("product_quantity[" + i + "]", cartItems[i].count); form.AddField("product_total[" + i + "]", cartItems[i].bookAmount.ToString("0.0")); // form.AddField("product_theme[" + i + "]", "null"); // form.AddField("product_remarks[" + i + "]", "null"); int c = 0; string base64String; string base64String1; // base64String = Convert.ToBase64String(cartItems[i].previewImage); // base64String1 = Convert.ToBase64String(cartItems[i].designImage[0]); base64String = cartItems[i].previewImageUrl; base64String1 = cartItems[i].designImageUrl[0]; // form.AddField("product_upload_media[" + i + "][" + c + "]", base64String1); // base64String1 // c++; foreach (var bytes in cartItems[i].designImageUrl) { // var tmpStr = Convert.ToBase64String(bytes); form.AddField("product_upload_media[" + i + "][" + c + "]", bytes); c++; } form.AddField("product_preview1_base64[" + i + "]", base64String); // form.AddField("product_preview2_base64[" + i + "]", base64String); } Debug.Log("form.data is : " + Encoding.UTF8.GetString(form.data)); using (UnityWebRequest www = UnityWebRequest.Post(baseURL, form)) { yield return www.SendWebRequest(); if (www.isNetworkError || www.isHttpError) { Debug.Log(www.error); callback?.Invoke(false); } else { string data = www.downloadHandler.text; Debug.Log(data); Debug.Log("Form upload complete!"); callback?.Invoke(true); } } yield return new WaitForSeconds(5); } public void StartUploadPicture(Action callback) { StartCoroutine(UploadPicture(callback)); } private IEnumerator UploadPicture(Action callback) { string apiUrl = "https://api.plugcustom.com.cn/kiosk/ImageUpload/api/upload/FujifilmKiosk"; Debug.Log("Start UploadPicture"); // 准备其他文本参数 Dictionary fields = new Dictionary { { "type", "auto" }, { "format", "png" }, // {"token", "你的认证令牌"} // 根据接口要求添加参数 }; foreach (var kv in ShoppingCartManager.Instance.ShoppingCart.datas) { var data = kv.Value; bool isRequestFinish = false; Debug.Log($"for {data.previewImageName} preview start"); yield return StartCoroutine(SendPostRequest(apiUrl, data.previewImage, data.previewImageName, fields, (b, u, s) => { if (b) { data.previewImageUrl = u.oss_url; Debug.Log($"for {data.previewImageName} preview finished"); } else { callback?.Invoke(false, s); } })); for (var index = 0; index < data.designImage.Count; index++) { int num = index; isRequestFinish = false; Debug.Log($"for {data.designImageName[num]} printing start"); var bytes = data.designImage[num]; var imageName = data.designImageName[num]; yield return StartCoroutine(SendPostRequest(apiUrl, bytes, imageName, fields, (b, u, s) => { if (b) { Debug.Log($"for {data.designImageName[num]} printing finished"); isRequestFinish = true; data.designImageUrl.Add(u.oss_url); } else { callback?.Invoke(false, s); } })); while (!isRequestFinish) { yield return null; } } } callback?.Invoke(true, ""); } async UniTask WaitSendFinish() { var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Post, "https://api.plugcustom.com.cn/kiosk/ImageUpload/api/upload/FujifilmKiosk"); var content = new MultipartFormDataContent(); content.Add(new StreamContent(File.OpenRead("kWktocHNu/d.png")), "file", "kWktocHNu/d.png"); request.Content = content; var response = await client.SendAsync(request); response.EnsureSuccessStatusCode(); Console.WriteLine(await response.Content.ReadAsStringAsync()); } // 示例:发送包含文件和其他参数的 POST 请求 public IEnumerator SendPostRequest(string apiUrl, byte[] fileBytes, string fileName, Dictionary formFields, Action callback) { // 1. 准备表单数据 List formData = new List(); // 添加文本参数(键值对) if (formFields != null) foreach (var field in formFields) { formData.Add(new MultipartFormDataSection(field.Key, field.Value)); } // // 2. 添加文件参数(确保文件存在) // if (File.Exists(filePath)) // { // byte[] fileBytes = File.ReadAllBytes(filePath); // string fileName = Path.GetFileName(filePath); // // 参数名:"file"(根据接口要求修改);文件MIME类型:根据实际文件类型修改 // } // else // { // Debug.LogError("文件不存在:" + filePath); // yield break; // } formData.Add(new MultipartFormFileSection("file", fileBytes, fileName, "image/png")); // 3. 创建 POST 请求 using (UnityWebRequest request = UnityWebRequest.Post(apiUrl, formData)) { // 设置超时时间(毫秒) request.timeout = 10000; // 4. 发送请求并等待响应 yield return request.SendWebRequest(); // 5. 处理响应 if (request.result == UnityWebRequest.Result.Success) { Debug.Log("请求成功,响应内容:" + request.downloadHandler.text); var response = JsonConvert.DeserializeObject(request.downloadHandler.text); callback?.Invoke(true, response, ""); // 在这里解析返回的 JSON 数据(可配合 JsonUtility 或 Newtonsoft.Json) } else { Debug.LogError("请求失败:" + request.error + ",状态码:" + request.responseCode); callback?.Invoke(false, null, "请求失败:" + request.error + ",状态码:" + request.responseCode); } } } } [System.Serializable] public class UploadImageResponse { public string object_key { get; set; } public string oss_url { get; set; } public bool success { get; set; } } }