繁体   English   中英

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

[英]Python Sockets, download is almost 10x the size of original file, upload is 0 bytes

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

使用Marmalade C ++ SDK。

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

  • FTP:文件传输完美无瑕
  • Dropbox:验证然后给我: 套接字[Errno 22]无效的参数
  • Google云端硬盘:进行身份验证,列出元数据,但文件传输会导致某些奇怪的行为

自从我完成了对果酱果酱子系统的所有绑定(像unix一样)后,某些功能却没有实现。 为了连接到Google云端硬盘,最初我对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)

完成这个小补丁后,我可以成功连接并从Google云端硬盘下载元数据。 然而:

  • 当我上传7KB文件时,该文件显示在Google云端硬盘上,但文件大小为0字节
  • 当我使用urllib下载7KB文件时,我得到了54KB文件

我知道这一定与套接字属性的配置错误有关,但并非所有属性都已实现。 这是一些标准的python测试输出(test_sockets,test_httplib)

在此处实施: 果酱/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)

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

希望可以解决这个问题,直到我解决为止。 如果发现有问题,请向我报告

我想到了。 我的文件处理代码有2个问题。

在上传中:

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM