当我尝试使用我的网络应用程序将文件上传到google drive api并且文件中包含带重音的字符时,我收到错误,例如'ç'。
我上传了包含两个请求的文件,一个包含文件信息的初始请求,并将uri返回到应该上传文件的位置,以及后续请求和文件本身。
第一个请求中出现错误(带有文件信息的请求)。
返回的错误只是一个'400 - 错误请求',我没有想法如何使用这种特性上传文件。
以下是我尝试上传gif图像文件时应用程序生成的请求示例。
Content-Type: application/json; charset=UTF-8
X-Upload-Content-Length: 257
Authorization: Bearer ******
X-Upload-Content-Type: image/gif
Host: www.googleapis.com
Content-Length: 126
Expect: 100-continue
请求正文只包含一个带有文件数据的json对象,下面是配置此初始请求的代码示例:
private WebRequest CreateInitialUploadRequest(String parentId, String title, String mimeType)
{
String uri = "https://www.googleapis.com/upload/drive/v2/files?uploadType=resumable&access_token=" + AUTH_KEY;
System.Net.WebRequest request = this.WebRequestFactory.CreateWebRequest(uri);
request.Method = "POST";
request.ContentType = "application/json; charset=UTF-8";
request.Headers.Add("X-Upload-Content-Length", length.ToString());
request.Headers.Add("Authorization", string.Format("Bearer {0}", AUTH_KEY));
request.Headers.Add("X-Upload-Content-Type", mimeType);
//Setup parent id folder for file
object[] parents = {new {id = parentId}};
object jsonObject = new
{
title = title,
mimeType = mimeType,
description = "foo bar",
parents = parents
};
String strData = new JavaScriptSerializer().Serialize(jsonObject);
byte[] data = Encoding.UTF8.GetBytes(strData);
request.ContentLength = data.Length;
var stream = request.GetRequestStream();
stream.Write(data, 0, data.Length);
stream.Close();
return request;
}
当我尝试调用这样的方法时:
WebRequest initialRequest = CreateInitialUploadRequest("valid-parent-folder", "invalid file ç", "image/gif");
//I get an 'bad request' http error code 400 in the following line:
initialRequest.GetResponse();
我应该以某种方式对请求进行编码吗?
答案 0 :(得分:1)
根据peleyal的评论,我解决了我的问题。我仍在使用rest调用而不是驱动api,但是我检查了驱动器api源代码并发现他们正在使用HttpRequestMessage类。将我的代码从WebRequest更改为HttpRequestMessage解决了这个问题:
var request = new HttpRequestMessage(HttpMethod.Post, uri);
string strData = new JavaScriptSerializer().Serialize(jsonObject);
var content = new StringContent(strData, Encoding.UTF8, "application/json");
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
request.Content = content;
答案 1 :(得分:0)
为什么不使用Google APIs .NET client library?正如您在我们的Media page中所看到的,我们支持可恢复的媒体上传,它非常易于使用,并且可以为您处理服务器错误。