我有一个 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) 我向上传 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 标头。我确定我在某处做了一些愚蠢的事情,但我已经把头撞在墙上太久了,以至于我看不到它。