1

我有一个 PHP 应用程序,它为用户提供了一些 Google Docs 集成,我正在尝试添加将文件直接上传到用户的 Docs 帐户的功能(我正在使用 PHP/cURL 滚动我自己,因为我的要求很简单而且我不想仅仅为了这个特性就弄乱 Zend Framework)。

我正在按照https://developers.google.com/google-apps/documents-list/#uploading_a_new_document_or_file_with_content_onlyhttps://developers.google.com/gdata/docs/resumable_upload的说明进行操作,一切正常好的,直到我尝试发送第二个块,此时我总是收到来自服务器的 503 Service Unavailable 响应。

以下是完整的事件序列:

1) 我向上传 URI 发送带有以下标头的 POST:

Host: docs.google.com
GData-Version: 3.0
Authorization: Bearer (token removed for security reasons, but it's there and correct)
Content-Length: 0
Slug: gmk_google_upload_test.txt
X-Upload-Content-Type: text/plain
X-Upload-Content-Length: 2652

服务器响应:

HTTP/1.1 200 OK
Server: HTTP Upload Server Built on Jul 30 2012 11:18:04 (1343672284)
Location: https://docs.google.com/feeds/upload/create-session/default/private/full?convert=false&upload_id=AEnB2Uoa4ba2XrKG58GU3uTSzKUKsQu_NfOUvyYDqW6iXwmHgBPiJsi1fg-RhxMVT7jAfd1o73fUtBaaZ1uLkwNwzT04NxQbuQ
Date: Tue, 31 Jul 2012 16:00:13 GMT
Pragma: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Cache-Control: no-cache, no-store, must-revalidate
Content-Length: 0
Content-Type: text/html; charset=UTF-8

到现在为止还挺好。

2)我使用这些标头将第一个块(512字节)从响应中放入URL:

Host: docs.google.com
Content-Length: 512
Content-Type: text/plain
Content-Range: bytes 0-511/2652

服务器响应:

HTTP/1.1 308 Resume Incomplete
Server: HTTP Upload Server Built on Jul 30 2012 11:18:04 (1343672284)
Date: Tue, 31 Jul 2012 16:00:14 GMT
Pragma: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Cache-Control: no-cache, no-store, must-revalidate
Content-Length: 0
Content-Type: text/html; charset=UTF-8

这可能是我的问题的开始,因为我没有收到来自服务器的 Range 标头,如文档中所述。但是,似乎某些事情必须对我有用才能获得 308 Resume Incomplete 响应。

3)当我使用(我认为)正确的标题和下一个块的范围信息发送下一个块时:

Host: docs.google.com
Content-Length: 512
Content-Type: text/plain
Content-Range: bytes 512-1023/2652

我总是从服务器得到这个响应:

HTTP/1.1 503 Service Unavailable
Server: HTTP Upload Server Built on Jul 30 2012 11:18:04 (1343672284)
Date: Tue, 31 Jul 2012 16:00:14 GMT
Pragma: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Cache-Control: no-cache, no-store, must-revalidate
Content-Length: 0
Content-Type: text/html; charset=UTF-8

我尝试了不同类型的文件、块大小等,但我总是得到相同的结果。奇怪的是,如果我发送请求以尝试获取服务器已接收的字节数(根据上面的文档链接):

PUT <upload_uri> HTTP/1.1
Host: docs.google.com
Content-Length: 0
Content-Range: bytes */100

我收到 308 Resume Incomplete 响应(如预期的那样),但仍然没有 Range 标头。我确定我在某处做了一些愚蠢的事情,但我已经把头撞在墙上太久了,以至于我看不到它。

4

2 回答 2

2

您是否考虑过使用较新的 Drive API?PHP 库不基于 Zend 框架,文档包括片段完整的 PHP 示例应用程序

如果您仍想自己实现可恢复上传协议,您应该看看它在较新的 API 中是如何支持的,包括 Google Drive API:

https://developers.google.com/drive/manage-uploads

于 2012-07-31T20:36:04.190 回答
2

刚刚解决了同样的问题Google drive

set size chunk = 256 * 1024
于 2012-08-28T04:58:01.660 回答