背景:很多时候避免不了要把现有的图片资源或者视频资源上传到自己的服务器上,就可以长期稳定的保存这些资源,尤其是引用别人的图片或者视频的时候。另外一点是,自己的网站或者系统在直接引用别人的图片或者视频链接的时候有时候会报错,比如https证书就会导致不能引用http的链接,以上两种原因就会需要我们完场如题目一样的操作。
解决:
一、批量下载图片或者视频到本地(代码版本)
由于作者是基于python语言的,所以这里的举例也以python为主。
下载使用requests库
import requests
import os
response=requests.get(url,headers).content
with open (file_name,'wb') as f:
f.write(response)
如果网页上有直接下载的链接,也可手动下载保存,操作繁琐,不建议使用?
这里说明一下啊,并不是一定要保存下来才可以上传到阿里云,后面会解释。
二、上传至阿里云
1、自己开发的接口
def get_video(url):
"""
获取视频内容
:param url:
:return:
"""
response=requests.get(url,headers=headers).content
file_name=url.split('.')[-1]
with open(file_name,'wb') as f:
f.write(response)
strat_url = 'https://xxxxxxxxxxxxx'
headers1={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
}
file=open(file_name,'rb')
files = {'file': file}
response = requests.post(strat_url, headers=headers1, files=files).json()
print(response)
#这里需要注意的是file对象是不能直接用response直接代替的,由于小编不会对应形式的转化,所以只有苯方法,保存以后再读取,如果有人知道如何转换,还请不吝赐教,不胜感激
出现的问题:文件上传大小有限制,一般图片没有问题,视频超出限制就无法正常上传
2、阿里云开发文档自带的
①不需要保存
def get_video_url(url):
"""
转换视频链接
:param url:
:return:
"""
response = requests.get(url, headers=headers).content
file_name = url.split('/')[-1]
accessKeyId = "xxxxxx"
accessKeySecret = "xxxxxxxx"
endpoint = "http://oss-cn-hangzhou.aliyuncs.com"
bucketName = "xxxxxx"
auth = oss2.Auth(accessKeyId,accessKeySecret)
bucket = oss2.Bucket(auth, endpoint,bucketName)
bucket.put_object('mnt/files/xxxx/{}'.format(file_name), response)
return 'https://域名/mnt/files/bigscreen/'+file_name
②已经保存的文件
def get_video_url(url):
"""
转换视频链接
:param url:
:return:
"""
accessKeyId = "*************"
accessKeySecret = "*************"
endpoint = "http://oss-cn-hangzhou.aliyuncs.com"
bucketName = "*************"
auth = oss2.Auth(accessKeyId,accessKeySecret)
# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称。
bucket = oss2.Bucket(auth, endpoint,bucketName)
# 必须以二进制的方式打开文件。
# 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件。
with open('temp.mp4', 'rb') as fileobj:
# # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传,直到文件结束。
fileobj.seek(0, os.SEEK_SET)
# # Tell方法用于返回当前位置。
current = fileobj.tell()
# 填写Object完整路径。Object完整路径中不能包含Bucket名称。
bucket.put_object('mnt/files/bigscreen/{}'.format(file_name), response)
#或者如下(百度版本,未经证实):
loacl_file_path='/path/to/loacl/file.txt'
oss_file_path='fold/file.txt'
bucket.put_object_from_file(oss_file_path,loacl_file_path)
另附上阿里云上传文档地址,如果出现其他的需求或者问题,可以查阅解决。