- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 google-api-client 将大文件上传到 gdrive。我正在使用可恢复上传。这里的问题是我不想在我的文件系统中保存/写入文件对象。我希望它以 block 的形式读取它,因此使用可恢复上传将相同的 block 上传到 Gdrive。无论如何,在我可以通过 google api python 客户端发送 block 的地方可以实现这一点。
这是我的示例代码,它可以工作,但它从客户端获取整个文件对象。
@app.route('/upload', methods = ["GET", "POST"])
def upload_buffer():
drive = cred()
if request.method == "POST":
mime_type = request.headers['Content-Type']
body = {
'name': "op.pdf",
'mimeType': mime_type,
}
chunk = BytesIO(request.stream.read()) # as you can see here the entire file stream is obtained
#I want to read in chunks and simultaneously send that chunk to GDrive
#chunk = BytesIO(request.stream.read(1024))
#if I send like the above only some part of the file is uploaded in Gdrive
media_body = MediaIoBaseUpload(chunk, chunksize = 1024, mimetype=mime_type,
resumable=True)
return drive.files().create(body=body,
media_body=media_body,
fields='id,name,mimeType,createdTime,modifiedTime').execute()
return render_template("upload_image.html")
<-------------------------------------------- ---------------------->这就是我使用 Google Rest API 的方式
@app.route('/upload3', methods=["GET", "POST"])
def upload_buff():
if request.method == "POST":
Content_Length = request.headers['Content-Length']
access_token = '####'
headers = {"Authorization": "Bearer " + access_token, "Content-Type": "application/json", "Content-Length": Content_Length}
params = {
"name": "file_name.pdf",
"mimeType": "application/pdf"
}
r = requests.post("https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable", headers=headers, data=json.dumps(params))
location = r.headers['Location']
print("----------------------------------------------------")
print("GDrive Upload url : ", location)
print("----------------------------------------------------")
start = str(0)
while True:
chunk = request.stream.read(1024 * 1024)
chunk_size = len(chunk)
print("----------------------------------------------------")
print("Size of Received Chunk From Client: ", chunk_size)
print("----------------------------------------------------")
if chunk_size == 0:
break
end = str(int(start)+chunk_size-1)
headers = {'Content-Range': 'bytes '+start+'-' + end + '/' +str(Content_Length), 'Content-Length': str(chunk_size)}
start = str(int(end)+1)
print("The headers set for the chunk upload : ", headers)
r = requests.put(location, headers=headers, data=chunk)
print("----------------------------------------------------")
print("Response content : ", r.content)
print("Response headers : ", r.headers)
print("Response status : ", r.status_code)
print("----------------------------------------------------")
return r.content
return render_template("upload_image.html")
最佳答案
阅读您的问题和代码,我假设您将流保存在一个名为 chunk
的变量中,并希望将其分成 1024 字节的 block 以使用 resumable upload .如果我对问题的理解是正确的,你可以在 bytes object 中使用切片。 chunk
以类似于此的方式:
chunk = b"\x04\x09\x09\x01\x01\x01\x00\x03" # Example values
chunk[:3] # Equals to b"\x04\x09\x09"
chunk[-3:] # Equals to b"\x01\x00\x03"
chunk[4:2] # Equals to b"\x01\x01"
您可以使用这种方法将 chunk
分成 1024 字节的片段。如果您需要更多帮助,请问我任何问题。
对于我对您问题的错误理解,我深表歉意。我现在了解到您有一个字节对象,分为多个 block ,并希望使用可恢复上传将其上传到云端硬盘。如果我的实际假设是正确的,您可以使用我为该场景编写的代码。使用此代码,无需在硬盘上写入任何内容。
#!/usr/bin/python
# -*- coding: utf-8 -*-
import json
import locale
import requests
import sys
from io import BytesIO
accessToken = \
'{YOUR ACCESS TOKEN HERE}'
fileData = \
BytesIO(requests.get('https://upload.wikimedia.org/wikipedia/commons/c/cf/Alhambra_evening_panorama_Mirador_San_Nicolas_sRGB-1.jpg'
).content).getvalue()
fileSize = sys.getsizeof(fileData) - 129
# Step I - Chop data into chunks
wholeSize = fileSize
chunkSize = 4980736 # Almost 5 MB
chunkTally = 0
chunkData = []
while wholeSize > 0:
if (chunkTally + 1) * chunkSize > fileSize:
chunkData.append(fileData[chunkTally * chunkSize:fileSize])
else:
chunkData.append(fileData[chunkTally * chunkSize:(chunkTally
+ 1) * chunkSize])
wholeSize -= chunkSize
chunkTally += 1
# Step II - Initiate resumable upload
headers = {'Authorization': 'Bearer ' + accessToken,
'Content-Type': 'application/json'}
parameters = {'name': 'alhambra.jpg',
'description': 'Evening panorama of Alhambra from Mirador de San Nicol\xc3\xa1s, Granada, Spain.'}
r = \
requests.post('https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable'
, headers=headers, data=json.dumps(parameters))
location = r.headers['location']
# Step III - File upload
chunkTally = 0
for chunk in chunkData:
if (chunkTally + 1) * chunkSize - 1 > fileSize - 1:
finalByte = fileSize - 1
chunkLength = fileSize - chunkTally * chunkSize
else:
finalByte = (chunkTally + 1) * chunkSize - 1
chunkLength = chunkSize
headers = {'Content-Length': str(chunkLength),
'Content-Range': 'bytes ' + str(chunkTally * chunkSize) \
+ '-' + str(finalByte) + '/' + str(fileSize)}
r = requests.put(location, headers=headers, data=chunk)
print(r.text) # Response
chunkTally += 1
例如,此脚本将采用 photo来自维基共享资源;您可以改用文件流。获取数据后,代码将根据变量使用的内存空间计算文件大小(因为它没有写入硬盘)。
下一步是将文件分成小于 5 MB 的 block 。我确保使用 1024*256 的倍数,详见 docs .数据将被迭代,直到它被分成几乎 5 MB 的 block (除了最后一个)。
在该操作之后,代码会将可恢复上传初始化为 documented使用 OAuth 2.0用于身份验证。在此步骤中,我为我的文件使用了一些示例元数据,但您可以继续阅读 Files properties关于其他的。最后,脚本会将位置保存在一个变量中以备将来上传。
在最后一步中, block 将被迭代并一个一个地上传。首先,一个标题是基于 specifications 构建的.之后,我们已经准备好 header 、 block 和上传位置,因此我们可以继续在请求中正式上传。上传每个 block 后,将打印响应以记录错误,并在最后一个 block 之后显示上传文件的元数据。这标志着整个操作的结束。作为最后的说明,我想提一下我是在 Python3 中编写和测试这个脚本的。如果您有任何疑问,请随时向我寻求澄清。
关于python - 使用 google-api-client 使用存储在内存中的 flask/python 中的可恢复上传将大文件从客户端上传到 GDrive,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61757978/
我正在运行一个辅助角色,并检查 Azure 上托管的存储中是否存在数据。当我将连接字符串用于经典类型的存储时,我的代码可以正常工作,但是当我连接到 V2 Azure 存储时,它会抛出此异常。 “远程服
在我的应用程序的主页上,我正在进行 AJAX 调用以获取应用程序各个部分所需的大量数据。该调用如下所示: var url = "/Taxonomy/GetTaxonomyList/" $.getJSO
大家好,我正在尝试将我的商店导入我的 Vuex Route-Gard。 路由器/auth-guard.js import {store} from '../store' export default
我正在使用 C# 控制台应用程序 (.NET Core 3.1) 从 Azure Blob 存储读取大量图像文件并生成这些图像的缩略图。新图像将保存回 Azure,并将 Blob ID 存储在我们的数
我想将 Mlflow 设置为具有以下组件: 后端存储(本地):在本地使用 SQLite 数据库存储 Mlflow 实体(run_id、params、metrics...) 工件存储(远程):使用 Az
我正在使用 C# 控制台应用程序 (.NET Core 3.1) 从 Azure Blob 存储读取大量图像文件并生成这些图像的缩略图。新图像将保存回 Azure,并将 Blob ID 存储在我们的数
我想将 Mlflow 设置为具有以下组件: 后端存储(本地):在本地使用 SQLite 数据库存储 Mlflow 实体(run_id、params、metrics...) 工件存储(远程):使用 Az
我的 Windows 计算机上的本地文件夹中有一些图像。我想将所有图像上传到同一容器中的同一 blob。 我知道如何使用 Azure Storage SDKs 上传单个文件BlockBlobServi
我尝试发出 GET 请求来获取我的 Azure Blob 存储帐户的帐户详细信息,但每次都显示身份验证失败。谁能判断形成的 header 或签名字符串是否正确或是否存在其他问题? 代码如下: cons
这是用于编写 JSON 的 NeutralinoJS 存储 API。是否可以更新 JSON 文件(推送数据),而不仅仅是用新的 JS 对象覆盖数据。怎么做到的??? // Javascript
我有一个并行阶段设置,想知道是否可以在嵌套阶段之前运行脚本,所以像这样: stage('E2E-PR-CYPRESS') { when { allOf {
我想从命令行而不是从GUI列出VirtualBox VM的详细信息。我对存储细节特别感兴趣。 当我在GUI中单击VM时,可以看到包括存储部分在内的详细信息: 但是到目前为止,我还没有找到通过命令行执行
我有大约 3500 个防洪设施,我想将它们表示为一个网络来确定流动路径(本质上是一个有向图)。我目前正在使用 SqlServer 和 CTE 来递归检查所有节点及其上游组件,只要上游路径没有 fork
谁能告诉我 jquery data() 在哪里存储数据以及何时删除以及如何删除? 如果我用它来存储ajax调用结果,会有性能问题吗? 例如: $("body").data("test", { myDa
有人可以建议如何为 Firebase 存储中的文件设置备份。我能够备份数据库,但不确定如何为 firebase 存储中的文件(我有图像)设置定期备份。 最佳答案 如何进行 Firebase 存储的本地
我最近开始使用 firebase 存储和 firebase 功能。现在我一直在开发从功能到存储的文件上传。 我已经让它工作了(上传完成并且文件出现在存储部分),但是,图像永远保持这样(永远在右侧加载)
我想只允许用户将文件上传到他们自己的存储桶中,最大文件大小为 1MB,仍然允许他们删除文件。我添加了以下内容: match /myusers/{userId}/{allPaths=**} { al
使用生命周期管理策略将容器的内容从冷访问层移动到存档。我正在尝试以下策略,希望它能在一天后将该容器中的所有文件移动到存档层,但事实并非如此在职的。我设置了选择标准“一天未使用后”。 这是 json 代
对于连接到 Azure 存储端点,有 http 和 https 两个选项。 第一。 https 会带来开销,可能是 5%-10%,但我不支付同一个数据中心的费用。 第二。 http 更快,但 Auth
有人可以帮我理解这一点吗?我创建了Virtual Machine in Azure running Windows Server 2012 。我注意到 Azure 自动创建了一个存储帐户。当我进入该存
我是一名优秀的程序员,十分优秀!