2015-05-07 57 views
1

更新代码:Python - 因为我可以将文件上传到服务器的几个部分?

import requests 
import re 

sessionObj = requests.session() 
sessionObj.post('http://bestream.tv/login.html', data={'loginUsername':'my_user', 'loginPassword':'my_pass', 'submitme':'1'}) 
filehandle = open('Diabolik Lovers - 12.mp4', 'rb') 

resp = sessionObj.get('http://bestream.tv/account_home.html') 

url_form = re.search('url: \'(http:\/\/.*)?\'', resp.text).group(1) 
sessionid = re.search('_sessionid:\s\'(.*)?\', cTracker:', resp.text).group(1) 
ctracker = re.search('cTracker:\s\'(.*)?\', maxChun', resp.text).group(1) 

tam=os.path.getsize('Diabolik Lovers - 12.mp4') 

headers={} 
n=0 
stop=0 

while stop < tam: 
    start = n*100000000 
    stop = min(start+99999999, tam) 
    contentrange = 'bytes {}-{}/{}'.format(start, stop, tam) 
    headers['Content-Range'] = contentrange 
    filehandle.seek(start) 
    r = sessionObj.post(url_form, headers=headers, files = {'files[]': (filehandle.name, filehandle)}) 
    n+=1 
    print(r.text) 

给出的答案是:

[{"name":"Diabolik Lovers - 6.5.mp4","size":68152948,"type":"","error":null}] 

当上传从网上的文件,我在Chrome中获得这样的结果 - >网络:

Accept:application/json, text/javascript, */*; q=0.01 
Content-Disposition:attachment; filename="Diabolik%20Lovers%20-%206.5.mp4" 
Content-Range:bytes 0-99999999/168152948 
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryHNdI5JvVzIVROkWQ 
Origin:http://bestream.tv 
Referer:http://bestream.tv/account_home.html 
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 


Accept:application/json, text/javascript, */*; q=0.01 
Content-Disposition:attachment; filename="Diabolik%20Lovers%20-%206.5.mp4" 
Content-Range:bytes 100000000-168152947/168152948 
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryfsXuVqiBMXo1Vtn7 
Origin:http://bestream.tv 
Referer:http://bestream.tv/account_home.html 
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 

我需要将文件上传成大于100000000字节的文件,怎么可能修改代码呢?

+0

您可以明确地制作范围请求并上传一段时间,但您必须手动完成。但你为什么想要?如果您只想(a)上传流媒体,并且可能(b)恢复中断上传,请提问。 – abarnert

+0

我如何明确制作范围请求并上传一段时间?服务器可以上传高达100000000字节的文件。从网站我可以上升到2GB,但我需要制作一个脚本来上传像网络一样工作的文件。 – Marco

+0

'请求'并没有真正的帮助你。您必须了解HTTP Content-Range规范,以及您的特定服务器如何处理它,然后编写标题并手动拆分文件。 – abarnert

回答

0

经过反复研究,终于我知道了!

import requests 
import os 
import re 


arc='Diabolik Lovers - 12.mp4' 
sessionObj = requests.session() 
sessionObj.post('http://bestream.tv/login.html', data={'loginUsername':'my_user', 'loginPassword':'my_pass', 'submitme':'1'}) 
filehandle = open(arc, 'rb') 

resp = sessionObj.get('http://bestream.tv/account_home.html') 

url_form = re.search('url: \'(http:\/\/.*)?\'', resp.text).group(1) 

tam = os.path.getsize(arc) 
l = 0 
n = 0 
headers={} 

while l < tam: 
    start = n*100000000 
    if start+99999999 < tam: 
     stop = min(start+99999999, tam) 
    else: 
     stop = tam-1 
    contentrange = 'bytes {}-{}/{}'.format(start, stop, tam) 
    headers['Content-Range'] = contentrange 
    filehandle.seek(start) 
    fi = 'file_%s' % n 
    filehandle2 = open(fi, 'wb') 
    f=filehandle.read(100000000) 
    filehandle2.write(f) 
    filehandle2.close() 
    ff=open(fi, 'rb') 
    r = sessionObj.post(url_form, headers=headers, files = {'files[]': (filehandle.name, ff)}) 
    ff.close() 
    os.remove(fi) 
    l+=len(f) 
    n+=1 
2

至少从版本2.7.0开始,requests不会做任何事情来帮助您使用部分内容请求。

但是,它也没有做任何事情阻碍你的方式。并不是那么难。

您确实需要了解RFC 7233,它描述了范围和内容范围如何工作。许多特定服务器的实际问题(或至少是您的特定服务器具有的任何实际问题)。但是基本的想法是很简单:

对于每亿个字节,发送另一个请求,一个额外的标题是这样的:

start = n*100000000 
stop = min(start+99999999, filesize) 
contentrange = 'bytes {}-{}/{}'.format(start, stop, filesize) 
headers['Content-Range'] = contentrange 

然后,当然,而不是发送整个文件,发送只是该文件的字节start - stop。 (你可以做到这一点的open荷兰国际集团的文件,然后seek荷兰国际集团到start,或mmap平的文件,然后发送一个视图片段,或其他任何你喜欢的。)

+0

我更新了我的问题。添加: TAM = os.path.getsize( '魔鬼爱人 - 12.mp4') 头= {} n = 0的 停止= 0 而停止 Marco

+0

给出的答案:[{名称“:”Diabolik Lovers - 6.5.mp4“,”size“:68152948, “type”:“”,“error”:null}] 为什么我会得到null? – Marco

相关问题