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

2024-04-26 01:36:51 发布

您现在位置:Python中文网/ 问答频道 /正文

使用嵌入式python2.7创建移动应用程序

使用果酱C++ SDK。< /H2>

我正在整合连接到云文件传输服务。你知道吗

  • FTP:文件传输工作完美无瑕
  • Dropbox:authenticates然后给我:socket[Errno 22]无效参数
  • googledrive:验证、列出元数据,但文件传输有一些奇怪的行为

因为我已经完成了对marmaladesocket子系统(类似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)

在完成这个小补丁之后,我可以成功地从googledrive连接并下载元数据。但是:

  • 当我上传一个7KB的文件时,这个文件会出现在Google驱动器上,但是有一个 文件大小为0字节
  • 当我使用urllib下载一个7KB的文件时,我得到一个 返回54KB文件

我知道这一定与套接字属性的错误配置有关,但并不是所有属性都实现了。 Here are some standard python test outputs (test_sockets , test_httplib )

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

有什么我可以尝试的替代品吗?你知道吗

我一点也不知道。你知道吗

From: 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)

Here is my Google upload / download / listing source code

希望在问题解决之前,我会强行这样做。如果我弄明白了,我会回来报到的


Tags: 文件ofthetestforinputoutputget
1条回答
网友
1楼 · 发布于 2024-04-26 01:36:51

我想出来了。我的文件处理代码有两个问题。你知道吗

上传时:

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

相关问题 更多 >