【问题标题】:Can't upload filename with special character to google drive REST无法将带有特殊字符的文件名上传到谷歌驱动器 REST
【发布时间】:2013-07-02 17:03:31
【问题描述】:

当我尝试使用我的 Web 应用程序将文件上传到 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();

我应该以某种方式对请求进行编码吗?

【问题讨论】:

  • 您确定是该角色导致了问题吗?您是否尝试过使用文件名 abc 上传文件? 400 - 错误请求可能有很多问题,但通常与安全问题或您尝试发布的对象格式不正确有关。
  • 我复制了文件并删除了“非英语”字符,它可以工作
  • 您有什么建议吗?我知道这与编码有关(可能),但我不知道如何解决它。
  • 我刚刚发布了stackoverflow.com/questions/17436002/… 的答案。请让我知道它是否适合您

标签: c# asp.net rest google-drive-api


【解决方案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;

【讨论】:

    【解决方案2】:

    为什么不使用Google APIs .NET client library?正如您在我们的Media page 中所看到的,我们支持可恢复的媒体上传,它非常易于使用,并且会为您处理服务器错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      相关资源
      最近更新 更多