我有一个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标头。我确定我在某个地方做了一些愚蠢的事情,但是我已经把头撞到了墙上足够长的时间,以至于我无法看到它。
答案 0 :(得分:2)
刚刚用Google drive
解决了同样的问题。
set size chunk = 256 * 1024
答案 1 :(得分:1)
您是否考虑过使用较新的Drive API? PHP library不基于Zend Framework,文档包含snippets和complete PHP sample application。
如果您仍想自行实施可恢复的上传协议,则应了解新API中的支持方式,包括Google Drive API: