UnityWebRequest.Post() multipart/form-data 不将文件附加到自身
UnityWebRequest.Post() multipart/form-data doesnt append files to itself
我想上传一张图片到 Nodejs 后端服务器(multer 插件处理多部分)
我的代码是这样的:
IEnumerator Uploadimage(string url, string _headerKey, string _headerValue)
{
_headerValue = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1YzBiNjgyOTc4YzBiMjMxYjQ1NGVkNmUiLCJpYXQiOjE1NDQyNTE0NTN9.tAFVjpAQMoWrY2d7-0hHQ3KPidHgRmBPcAEL4Pr203Y";
List<IMultipartFormSection> form = new List<IMultipartFormSection>();
Texture2D texture = new Texture2D(2, 2);
string dirPath = Application.persistentDataPath + "/saveImages/";
System.IO.DirectoryInfo info = new System.IO.DirectoryInfo(dirPath);
System.IO.FileInfo[] fileInfo = info.GetFiles();
if (fileInfo[fileInfo.Length - 1].Extension.ToString() == ".jpg" && fileInfo[fileInfo.Length - 1].Name.ToString().Substring(0, 5) == "Image")
{
byte[] byteArray = System.IO.File.ReadAllBytes(dirPath + fileInfo[fileInfo.Length - 1].Name.ToString());
texture.LoadImage(byteArray);
Debug.Log("111" + dirPath + fileInfo[fileInfo.Length - 1].Name.ToString());
// string result = Convert.ToBase64String(byteArray);
}
// generate a boundary then convert the form to byte[]
byte[] boundary = UnityWebRequest.GenerateBoundary();
string contentTypeString = "";
contentTypeString = "multipart/form-data; boundary=" + System.Text.Encoding.UTF8.GetString(boundary);
// read a file and add it to the form
Debug.Log("ssss");
form.Add(new MultipartFormDataSection("avatar33", "myData"));
form.Add(new MultipartFormFileSection("avatar", ImageConversion.EncodeToJPG(texture), "test.jpeg", "image/jpeg"));
UnityWebRequest www = UnityWebRequest.Post(url, form);
byte[] formSections = UnityWebRequest.SerializeFormSections(form, boundary);
byte[] terminate = System.Text.Encoding.UTF8.GetBytes(String.Concat("\r\n--", System.Text.Encoding.UTF8.GetString(boundary), "--"));
// Make my complete body from the two byte arrays
byte[] body = new byte[formSections.Length + terminate.Length];
Buffer.BlockCopy(formSections, 0, body, 0, formSections.Length);
Buffer.BlockCopy(terminate, 0, body, formSections.Length, terminate.Length);
string contentType = String.Concat("multipart/form-data; boundary=", System.Text.Encoding.UTF8.GetString(boundary));
// Make my request object and add the raw body. Set anything else you need here
//www.uploadHandler = new UploadHandlerRaw(body);
//www.uploadHandler.contentType = contentTypeString;
UploadHandler uploader = new UploadHandlerRaw(body);
uploader.contentType = contentType;
www.uploadHandler = uploader;
//set jwt
if (_headerKey != null)
www.SetRequestHeader(_headerKey, _headerValue);
// www.SetRequestHeader("Content-Type", "multipart/form-data");
yield return www.SendWebRequest();
Debug.Log("request.GetResponseHeader " + www);
Debug.Log("request.GetResponseHeader " + www.responseCode);
}
在header中实现了JWT(不重要)...
我将调试放在我读取我的图像并且存在的地方...
我按照其他 post 所说的每一种方式进行操作,但其中 none 有效....
我看到的是,如果我使用 postman fileuploaded seccessfully(我 运行 在本地服务器)
-------------------------------------------- --------代码略有改动,还是没有成功
IEnumerator Uploadimage(string url, string _headerKey, string _headerValue)
{
_headerValue = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1YzBiNjgyOTc4YzBiMjMxYjQ1NGVkNmUiLCJpYXQiOjE1NDQyNTE0NTN9.tAFVjpAQMoWrY2d7-0hHQ3KPidHgRmBPcAEL4Pr203Y";
List<IMultipartFormSection> form = new List<IMultipartFormSection>();
Texture2D texture = new Texture2D(2, 2);
string dirPath = Application.persistentDataPath + "/saveImages/";
System.IO.DirectoryInfo info = new System.IO.DirectoryInfo(dirPath);
System.IO.FileInfo[] fileInfo = info.GetFiles();
if (fileInfo[fileInfo.Length - 1].Extension.ToString() == ".png" && fileInfo[fileInfo.Length - 1].Name.ToString().Substring(0, 5) == "Image")
{
byte[] byteArray = System.IO.File.ReadAllBytes(dirPath + fileInfo[fileInfo.Length - 1].Name.ToString());
texture.LoadImage(byteArray);
}
// generate a boundary then convert the form to byte[]
byte[] boundary = UnityWebRequest.GenerateBoundary();
string contentTypeString = "";
contentTypeString = "multipart/form-data; boundary=" + System.Text.Encoding.UTF8.GetString(boundary);
// read a file and add it to the form
form.Add(new MultipartFormDataSection("avatar33", "myData"));
form.Add(new MultipartFormFileSection("avatar", ImageConversion.EncodeToJPG(texture), "test.jpeg", "image/jpeg"));
UnityWebRequest www = UnityWebRequest.Post(url, form);
//set jwt
if (_headerKey != null)
www.SetRequestHeader(_headerKey, _headerValue);
www.SetRequestHeader("Content-Type", "multipart/form-data");
yield return www.SendWebRequest();
Debug.Log("request.GetResponseHeader " + www);
Debug.Log("request.GetResponseHeader " + www.responseCode);
}
好的,我找到了解决方案:
1.you 应该只生成边界并首先在 end:the 处放置一个终止边界 post 表明
2.then 应该解决的最奇怪的问题是将 form.data 字节转换为字符串并替换
内容处置:文件
和
内容配置:表单数据
现在它可以与 IMultipartFormSection 一起使用
我想上传一张图片到 Nodejs 后端服务器(multer 插件处理多部分)
我的代码是这样的:
IEnumerator Uploadimage(string url, string _headerKey, string _headerValue)
{
_headerValue = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1YzBiNjgyOTc4YzBiMjMxYjQ1NGVkNmUiLCJpYXQiOjE1NDQyNTE0NTN9.tAFVjpAQMoWrY2d7-0hHQ3KPidHgRmBPcAEL4Pr203Y";
List<IMultipartFormSection> form = new List<IMultipartFormSection>();
Texture2D texture = new Texture2D(2, 2);
string dirPath = Application.persistentDataPath + "/saveImages/";
System.IO.DirectoryInfo info = new System.IO.DirectoryInfo(dirPath);
System.IO.FileInfo[] fileInfo = info.GetFiles();
if (fileInfo[fileInfo.Length - 1].Extension.ToString() == ".jpg" && fileInfo[fileInfo.Length - 1].Name.ToString().Substring(0, 5) == "Image")
{
byte[] byteArray = System.IO.File.ReadAllBytes(dirPath + fileInfo[fileInfo.Length - 1].Name.ToString());
texture.LoadImage(byteArray);
Debug.Log("111" + dirPath + fileInfo[fileInfo.Length - 1].Name.ToString());
// string result = Convert.ToBase64String(byteArray);
}
// generate a boundary then convert the form to byte[]
byte[] boundary = UnityWebRequest.GenerateBoundary();
string contentTypeString = "";
contentTypeString = "multipart/form-data; boundary=" + System.Text.Encoding.UTF8.GetString(boundary);
// read a file and add it to the form
Debug.Log("ssss");
form.Add(new MultipartFormDataSection("avatar33", "myData"));
form.Add(new MultipartFormFileSection("avatar", ImageConversion.EncodeToJPG(texture), "test.jpeg", "image/jpeg"));
UnityWebRequest www = UnityWebRequest.Post(url, form);
byte[] formSections = UnityWebRequest.SerializeFormSections(form, boundary);
byte[] terminate = System.Text.Encoding.UTF8.GetBytes(String.Concat("\r\n--", System.Text.Encoding.UTF8.GetString(boundary), "--"));
// Make my complete body from the two byte arrays
byte[] body = new byte[formSections.Length + terminate.Length];
Buffer.BlockCopy(formSections, 0, body, 0, formSections.Length);
Buffer.BlockCopy(terminate, 0, body, formSections.Length, terminate.Length);
string contentType = String.Concat("multipart/form-data; boundary=", System.Text.Encoding.UTF8.GetString(boundary));
// Make my request object and add the raw body. Set anything else you need here
//www.uploadHandler = new UploadHandlerRaw(body);
//www.uploadHandler.contentType = contentTypeString;
UploadHandler uploader = new UploadHandlerRaw(body);
uploader.contentType = contentType;
www.uploadHandler = uploader;
//set jwt
if (_headerKey != null)
www.SetRequestHeader(_headerKey, _headerValue);
// www.SetRequestHeader("Content-Type", "multipart/form-data");
yield return www.SendWebRequest();
Debug.Log("request.GetResponseHeader " + www);
Debug.Log("request.GetResponseHeader " + www.responseCode);
}
在header中实现了JWT(不重要)...
我将调试放在我读取我的图像并且存在的地方...
我按照其他 post 所说的每一种方式进行操作,但其中 none 有效....
我看到的是,如果我使用 postman fileuploaded seccessfully(我 运行 在本地服务器)
-------------------------------------------- --------代码略有改动,还是没有成功
IEnumerator Uploadimage(string url, string _headerKey, string _headerValue)
{
_headerValue = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI1YzBiNjgyOTc4YzBiMjMxYjQ1NGVkNmUiLCJpYXQiOjE1NDQyNTE0NTN9.tAFVjpAQMoWrY2d7-0hHQ3KPidHgRmBPcAEL4Pr203Y";
List<IMultipartFormSection> form = new List<IMultipartFormSection>();
Texture2D texture = new Texture2D(2, 2);
string dirPath = Application.persistentDataPath + "/saveImages/";
System.IO.DirectoryInfo info = new System.IO.DirectoryInfo(dirPath);
System.IO.FileInfo[] fileInfo = info.GetFiles();
if (fileInfo[fileInfo.Length - 1].Extension.ToString() == ".png" && fileInfo[fileInfo.Length - 1].Name.ToString().Substring(0, 5) == "Image")
{
byte[] byteArray = System.IO.File.ReadAllBytes(dirPath + fileInfo[fileInfo.Length - 1].Name.ToString());
texture.LoadImage(byteArray);
}
// generate a boundary then convert the form to byte[]
byte[] boundary = UnityWebRequest.GenerateBoundary();
string contentTypeString = "";
contentTypeString = "multipart/form-data; boundary=" + System.Text.Encoding.UTF8.GetString(boundary);
// read a file and add it to the form
form.Add(new MultipartFormDataSection("avatar33", "myData"));
form.Add(new MultipartFormFileSection("avatar", ImageConversion.EncodeToJPG(texture), "test.jpeg", "image/jpeg"));
UnityWebRequest www = UnityWebRequest.Post(url, form);
//set jwt
if (_headerKey != null)
www.SetRequestHeader(_headerKey, _headerValue);
www.SetRequestHeader("Content-Type", "multipart/form-data");
yield return www.SendWebRequest();
Debug.Log("request.GetResponseHeader " + www);
Debug.Log("request.GetResponseHeader " + www.responseCode);
}
好的,我找到了解决方案:
1.you 应该只生成边界并首先在 end:the 处放置一个终止边界 post 表明
2.then 应该解决的最奇怪的问题是将 form.data 字节转换为字符串并替换 内容处置:文件 和 内容配置:表单数据
现在它可以与 IMultipartFormSection 一起使用