C# Google Drive API上载HTTP多部分Unity3d

C# Google Drive API上载HTTP多部分Unity3d,c#,unity3d,file-upload,google-drive-api,C#,Unity3d,File Upload,Google Drive Api,我有这种代码 List<IMultipartFormSection> formData = new List<IMultipartFormSection>(); formData.Add(new MultipartFormDataSection("metadata","{ \"name\":" + salvataggio2.Substring(0, salvataggio2.Length - 5) + "

我有这种代码

List<IMultipartFormSection> formData = new List<IMultipartFormSection>();
formData.Add(new MultipartFormDataSection("metadata","{ \"name\":" + salvataggio2.Substring(0, salvataggio2.Length - 5) + "-to-google-drive.json" + ", \"parents\":['" + entries.Files[0].Id + "'] }","application/json"));
formData.Add(new MultipartFormDataSection("file", Application.persistentDataPath + "/Saves/" + salvataggio2, "application/json"));
//formData.Add(new MultipartFormFileSection(salvataggio2.Substring(0, salvataggio2.Length - 5) + "-to-google-drive.json", Application.persistentDataPath + "/Saves/" + salvataggio2));
//string jsonMetadata = "--foo_bar_baz" + System.Environment.NewLine + " Content-Type: application/json; charset=UTF-8 { \"name\":" + salvataggio2.Substring(0, salvataggio2.Length - 5) + "-to-google-drive.json" + ", \"parents\":['" + entries.Files[0].Id + "'] }" + System.Environment.NewLine + "--foo_bar_baz" + System.Environment.NewLine + "Content-Type: application/json; charset=UTF-8" + File.ReadAllText(Application.persistentDataPath + "/Saves/" + salvataggio2) + System.Environment.NewLine + "--foo_bar_baz--" + System.Environment.NewLine;
//byte[] bytes = Encoding.UTF8.GetBytes(jsonMetadata);
using (UnityWebRequest www = UnityWebRequest.Post("https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart", formData)) {
//var upload = new UploadHandlerRaw(bytes);
//www.uploadHandler = upload;
www.SetRequestHeader("Authorization", "Bearer " + response.Access_token);
//www.SetRequestHeader("Content-Type", "multipart/related; boundary=foo_bar_baz");

yield return www.SendWebRequest();
if (www.result == UnityWebRequest.Result.ConnectionError || www.result == UnityWebRequest.Result.ProtocolError) {
    Debug.Log(www.downloadHandler.text);
    this.gameObject.SetActive(false);
} else {
    Debug.Log(www.downloadHandler.text);
}
}
我并不真的不明白我需要改变什么,因为我仍然得到“在多部分体中缺少端点边界”

--foo_bar_baz——应该是结局

我的代码部分现在看起来像这样

string jsonMetadata = "--foo_bar_baz" + System.Environment.NewLine 
            + "Content-Disposition: form-data; name=\"metadata\"" + System.Environment.NewLine 
            + "Content-Type: application/json; charset=UTF-8" + System.Environment.NewLine + System.Environment.NewLine
            + "{ \"name\":\"" + salvataggio2.Substring(0, salvataggio2.Length - 5) + "-to-google-drive.json\"" + ", \"parents\":[\"" + entries.Files[0].Id + "\"] }" + System.Environment.NewLine 
            + "--foo_bar_baz" + System.Environment.NewLine
            + "Content-Disposition: form-data; name=\"file\"" + System.Environment.NewLine
            + "Content-Type: application/json; charset=UTF-8" + System.Environment.NewLine + System.Environment.NewLine
            + File.ReadAllText(Application.persistentDataPath + "/Saves/" + salvataggio2) + System.Environment.NewLine 
            + "--foo_bar_baz--" + System.Environment.NewLine;

好的,我终于解决了这个问题(我可以说,我现在不确定它是如何工作的,但我可以肯定地说,我需要用Unity api创建边界)

List formData=new List();
formData.Add(新的MultipartFormDataSection(“metadata”、“{\”name\”:\”+salvataggio2.Substring(0,salvataggio2.Length-5)+”-到google drive.json\+”、“\”parents\”:[\”“+entries.Files[0].Id+“\”],“application/json”);
添加(新的MultipartFormDataSection(“file”,file.ReadAllText(Application.persistentDataPath+“/Saves/”+salvataggio2),“Application/json”);
字节[]边界=UnityWebRequest.GenerateBondary();
字节[]formSections=UnityWebRequest.SerializeFormSections(formData,边界);
byte[]terminate=Encoding.UTF8.GetBytes(String.Concat(“\r\n--”),Encoding.UTF8.GetString(boundary),“--”);
byte[]body=新字节[formSections.Length+terminate.Length];
块拷贝(formSections,0,body,0,formSections.Length);
Buffer.BlockCopy(terminate,0,body,formSections.Length,terminate.Length);
string contentType=string.Concat(“多部分/相关;边界=,Encoding.UTF8.GetString(边界));
使用(UnityWebRequest www=UnityWebRequest.Post)https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart", "")) {
var upload=新的UploadHandlerRaw(主体);
www.uploadHandler=upload;
www.SetRequestHeader(“授权”、“承载人”+响应.Access\u令牌);
www.SetRequestHeader(“内容类型”,contentType);
返回www.SendWebRequest();
if(www.result==UnityWebRequest.result.ConnectionError | | www.result==UnityWebRequest.result.ProtocolError){
Log(www.downloadHandler.text);
this.gameObject.SetActive(false);
}否则{
Log(www.downloadHandler.text);
}
}
正如您可以看到的,在前2次添加到formData之后(与之前相同),它创建了一个随机边界,它序列化了表单和边界,它创建了一个终止,它融合了所有内容,并创建了一个兼容的内容类型。
在那之后,我只创建了通常的Unity Post(在正文中使用UploadHandler作为字节数组),就完成了。

这是否回答了您的问题@DaImTo我已经读过了。我不认为这是与Unity3d formData兼容的问题。事实上,我在Unity网站的“stackoverflow-like”网站上找到了自己的部分答案。我会在1小时内(尽快)接受我自己的答案。请不要结束这个问题,没有必要,它可以帮助很多需要在Unity3d中使用google drive API的人(google没有官方支持,也没有官方框架)。
string jsonMetadata = "--foo_bar_baz" + System.Environment.NewLine 
            + "Content-Disposition: form-data; name=\"metadata\"" + System.Environment.NewLine 
            + "Content-Type: application/json; charset=UTF-8" + System.Environment.NewLine + System.Environment.NewLine
            + "{ \"name\":\"" + salvataggio2.Substring(0, salvataggio2.Length - 5) + "-to-google-drive.json\"" + ", \"parents\":[\"" + entries.Files[0].Id + "\"] }" + System.Environment.NewLine 
            + "--foo_bar_baz" + System.Environment.NewLine
            + "Content-Disposition: form-data; name=\"file\"" + System.Environment.NewLine
            + "Content-Type: application/json; charset=UTF-8" + System.Environment.NewLine + System.Environment.NewLine
            + File.ReadAllText(Application.persistentDataPath + "/Saves/" + salvataggio2) + System.Environment.NewLine 
            + "--foo_bar_baz--" + System.Environment.NewLine;
        List<IMultipartFormSection> formData = new List<IMultipartFormSection>();
        formData.Add(new MultipartFormDataSection("metadata", "{ \"name\":\"" + salvataggio2.Substring(0, salvataggio2.Length - 5) + "-to-google-drive.json\"" + ", \"parents\":[\"" + entries.Files[0].Id + "\"] }", "application/json"));
        formData.Add(new MultipartFormDataSection("file", File.ReadAllText(Application.persistentDataPath + "/Saves/" + salvataggio2), "application/json"));
        byte[] boundary = UnityWebRequest.GenerateBoundary();
        byte[] formSections = UnityWebRequest.SerializeFormSections(formData, boundary);
        byte[] terminate = Encoding.UTF8.GetBytes(String.Concat("\r\n--", Encoding.UTF8.GetString(boundary), "--"));
        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/related; boundary=", Encoding.UTF8.GetString(boundary));

        using (UnityWebRequest www = UnityWebRequest.Post("https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart", "")) {
            var upload = new UploadHandlerRaw(body);
            www.uploadHandler = upload;
            www.SetRequestHeader("Authorization", "Bearer " + response.Access_token);
            www.SetRequestHeader("Content-Type", contentType);

            yield return www.SendWebRequest();
            if (www.result == UnityWebRequest.Result.ConnectionError || www.result == UnityWebRequest.Result.ProtocolError) {
                Debug.Log(www.downloadHandler.text);
                this.gameObject.SetActive(false);
            } else {
                Debug.Log(www.downloadHandler.text);
            }
        }