Python套接字,下载几乎是原始文件大小的10倍,上传是0字节



使用嵌入式Python 2.7创建移动应用程序

使用Marmalade C++SDK

我正在将连接集成到云文件传输服务。

  • FTP:文件传输工作完美
  • Dropbox:authenticates然后给我:socket〔Errno 22〕无效参数
  • 谷歌硬盘:身份验证,列出元数据,但文件传输非法一些奇怪的行为

由于我已经完成了与橘子酱套接字子系统(类unix)的所有绑定,但有些功能尚未实现。为了连接到Google Drive,最初我对httplib2/init.py进行了一些修改,设置了的所有实例

self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
#to this:
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

完成这个小补丁后,我可以成功地连接并从谷歌硬盘下载元数据。但是:

  • 当我上传一个7KB的文件时,该文件会出现在Google Drive上,但有一个文件大小为0字节
  • 当我使用urlib下载一个7KB的文件时,我会得到54KB文件备份

我知道这一定和套接字属性的错误配置有关,但并不是所有的属性都实现了。以下是一些标准的python测试输出(testrongockets、test_httplib)

此处执行:Marmalade/h/std/netdb.h

作为一个可行的替代者,有什么我应该尝试的吗

我一点也不知道。

来自:unix man setsockopt(2)

SO_DEBUG          enables recording of debugging information
SO_REUSEADDR       enables local address reuse
SO_REUSEPORT       enables duplicate address and port bindings
SO_KEEPALIVE       enables keep connections alive
SO_DONTROUTE       enables routing bypass for outgoing messages
SO_LINGER         linger on close if data present
SO_BROADCAST       enables permission to transmit broadcast messages
SO_OOBINLINE       enables reception of out-of-band data in band
SO_SNDBUF         set buffer size for output
SO_RCVBUF         set buffer size for input
SO_SNDLOWAT       set minimum count for output
SO_RCVLOWAT       set minimum count for input
SO_SNDTIMEO       set timeout value for output
SO_RCVTIMEO       set timeout value for input
SO_ACCEPTFILTER    set accept filter on listening socket
SO_TYPE       get the type of the socket (get only)
SO_ERROR          get and clear error on the socket (get only)

这是我的谷歌上传/下载/列表源代码

希望问题得到解决之前,我会强行这么做。如果我找到,我会报告

我想明白了。我的文件处理代码有两个问题。

上传时:

database_file = drive.CreateFile()
database_file['title'] = packageName
# this needs to be set
database_file.SetContentFile(packageName)
#
database_file['parents']=[{"kind": "drive#fileLink" ,'id': str(cloudfolderid) }]

在下载时,我使用了错误的url(webContentLink仅适用于浏览器,请使用"downloadUrl")。然后我还需要制作一个标题来授权下载

import urllib2
import json

url = 'https://doc-14-5g-docs.googleusercontent.com/docs/securesc/n4vedqgda15lkaommio7l899vgqu4k84/ugncmscf57d4r6f64b78or1g6b71168t/1409342400000/13487736009921291757/13487736009921291757/0B1umnT9WASfHUHpUaWVkc0xhNzA?h=16653014193614665626&e=download&gd=true'
#Parse saved credentials
credentialsFile = open('./configs/gcreds.dat', 'r')
rawJson =  credentialsFile.read()
credentialsFile.close()
values = json.loads(rawJson)
#Header must include: {"Authorization" : "Bearer xxxxxxx SomeToken xxxxx"}
ConstructedHeader = "Bearer " + str(values["token_response"]["access_token"])
Header = {"Authorization": ConstructedHeader}
req = urllib2.Request( url, headers= Header )
response = urllib2.urlopen(req)
output = open("UploadTest.z.crypt",'wb')
output.write(response.read())
output.close()

最新更新