【问题标题】:How to Upload a file using Openload.co API如何使用 Openload.co API 上传文件
【发布时间】:2017-09-22 23:14:23
【问题描述】:

我正在尝试使用 Openload REST API 将 upload a file 称为“240p.mp4”。

由于上传端点需要文件的 SHA-1 哈希,我通过这样做得到它:

sha1 = hashlib.sha1()

BLOCKSIZE = 65536
with open('240p.mp4', 'rb') as afile:
    buf = afile.read(BLOCKSIZE)
    while len(buf) > 0:
        sha1.update(buf)
        buf = afile.read(BLOCKSIZE)

sha1_hash = sha1.hexdigest()

所以我请求了一个上传链接:

url = "https://api.openload.co/1/file/ul?login={login}&key={key}&sha1={sha1}".format(
    login='YOUR_LOGIN',
    key='YOUR_API_KEY',
    sha1=sha1_hash,
)

p = {
    'url': url,
    'headers': {
        'User-Agent': self.ua,
    }
}
r = self.r.get(url=p['url'], headers=p['headers'])
j = r.json()

upload_link = j['result']['url']

他们建议做一个 CURL 但我更喜欢requests 人^^

curl -F file1=@/path/to/file.txt https://13abc37.example.com/ul/jAZUhVzeU78

所以我尝试使用 POST 请求来复制它:

p = {
    'url': upload_link,
    'headers': {
        'user-agent': self.ua,
        'Content-Type': 'multipart/form-data; boundary="xxx"',
    },
    'files': {
        'file1': open('/scripts/wordpress/240p.mp4', "rb"),
      # I've also tried this (and some others)
      # 'file1': ('240.mp4', open('/scripts/wordpress/240p.mp4', "rb"), 'video/mp4')
    }
}
r = self.r.post(url=p['url'], headers=p['headers'], files=p['files'])

但是它返回这个错误响应:

r.content¬
{
    "status": 500,
    "msg": "failed to read: closed"
}

理论上,状态 500 错误是来自服务器的错误。但是为什么我会收到这个错误?

N1:我已经明确设置了boundary="xxx",因为如果我不这样做。响应返回它丢失。所以我设置了它。

N2:文件/scripts/wordpress/240p.mp4的路径是正确的。还有权限。

N3:我知道远程上传功能,但我需要从二进制文件上传(我的意思是从本地)

N4:很明显,但self.rrequests.session() 的分配

【问题讨论】:

标签: python rest api multipartform-data


【解决方案1】:

我知道为什么它不起作用了。 通过让requests 处理content-typeheader 解决了这个问题。 multipart 字段中namevariable 的值无关紧要,你可以称它为file1file_upload 或其他任何名称。

这对我有用:

filepath = '/scripts/wordpress/240p.mp4'

sha1 = hashlib.sha1()

BLOCKSIZE = 65536
with open(filepath, 'rb') as afile:
    buf = afile.read(BLOCKSIZE)
    while len(buf) > 0:
        sha1.update(buf)
        buf = afile.read(BLOCKSIZE)

sha1_hash = sha1.hexdigest()

url = "https://api.openload.co/1/file/ul?login={login}&key={key}&sha1={sha1}".format(
    login='YOUR_LOGIN',
    key='YOUR_API_KEY',
    sha1=sha1_hash,
)

p = {
    'url': url,
    'headers': {
        'User-Agent': self.ua,
    }
}
r = self.r.get(url=p['url'], headers=p['headers'])
j = r.json()

upload_link = j['result']['url']

p = {
    'url': upload_link,
    'headers': {
        'user-agent': self.ua,
    },
    'files': {
        'file1': open(filepath, 'rb'),
    }
}
r = self.r.post(url=p['url'], headers=p['headers'], files=p['files'])

【讨论】:

    【解决方案2】:

    试试这个代码.....使用openload api上传文件。

    首先使用这个 url 获取文件夹 id

    https://api.openload.co/1/file/listfolder?login=XXXXXXX&key=XXXX

    在获取文件夹 id 后,将文件夹 id、登录名、密钥添加到下面的代码中。就是这样。

    <html>
    		<form action="demo3.php"  method="post" enctype="multipart/form-data" >
    			<input type="file" name="file">
    			<input type="submit" name="submit" id="submit" value="upload">
    		</form>
    
    		<?php
    			$ch = curl_init();
    			curl_setopt($ch, CURLOPT_URL, 'https://api.openload.co/1/file/ul?login=XXXXXXXXX&key=XXXXXXX&folder=3994051');
    			// Set so curl_exec returns the result instead of outputting it.
    			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    			// Get the response and close the channel.
    			$response = curl_exec($ch);
    			$json=json_decode($response);
    			$url=$json->result->url;
    
    			curl_close($ch);
    			if(isset($_FILES['file']['tmp_name']))
    			{
    				
    				$ch1=curl_init();
    				$cfile=new CURLFile($_FILES['file']['tmp_name'],$_FILES['file']['name']);
    				$cfile->setPostFilename(basename($_FILES["file"]["name"]));
    				$data=array("file"=>$cfile);
    				curl_setopt($ch1, CURLOPT_URL, $url);
    				curl_setopt($ch1, CURLOPT_POST, true);
    				curl_setopt($ch1, CURLOPT_POSTFIELDS, $data);
    				curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
    				$response1=curl_exec($ch1);
    				$json1=json_decode($response1);
    				echo $json1->result->url;
    				echo $response1;
    				curl_close($ch1);
    				#echo $json1;
    			}
    		?>
    </html>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-24
      • 2017-06-01
      • 2014-08-16
      • 2015-12-03
      • 2018-01-09
      相关资源
      最近更新 更多