使用cURL发送第一大块Google Docs可恢复上传后的响应503

时间:2012-07-31 16:15:07

标签: php curl google-docs-api google-drive-api

我有一个PHP应用程序,它为用户提供了一些Google Docs集成,我正在尝试添加将文件直接上传到用户的Docs帐户的功能(我正在使用PHP / cURL自行编写,因为我的要求是很简单,我不想只为这一个功能搞乱Zend Framework。)

我正在按照https://developers.google.com/google-apps/documents-list/#uploading_a_new_document_or_file_with_content_only的说明进行操作 https://developers.google.com/gdata/docs/resumable_upload,在我尝试发送第二个块之前,似乎工作正常,此时我总是从服务器收到503 Service Unavailable响应。

以下是完整的事件序列:

1)我将带有以下标题的POST发送到上传URI:

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标头。我确定我在某个地方做了一些愚蠢的事情,但是我已经把头撞到了墙上足够长的时间,以至于我无法看到它。

2 个答案:

答案 0 :(得分:2)

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

set size chunk = 256 * 1024

答案 1 :(得分:1)

您是否考虑过使用较新的Drive API? PHP library不基于Zend Framework,文档包含snippetscomplete PHP sample application

如果您仍想自行实施可恢复的上传协议,则应了解新API中的支持方式,包括Google Drive API:

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