【问题标题】:How do I upload files to the server using the drf-chunked-upload library?如何使用 drf-chunked-upload 库将文件上传到服务器?
【发布时间】:2021-11-05 17:32:48
【问题描述】:

我尝试了很多方法将文件上传到服务器,但我总是得到响应{“detail”:“没有提交块文件”}。如何正确使用这个库?

我的一个尝试:

import requests

url = 'http://127.0.0.1:8000/chunked_upload/'

in_file = open("testfile.txt", "rb")
data = in_file.read()
response = requests.put(
    url,
    headers={
        "Content-Range": f"bytes {0}-{9}/{10}"
    },
    data={"filename": "testfile"},
    files={'file': data},
)

【问题讨论】:

  • 尽量不要读取文件,直接使用文件句柄。
  • @KlausD。你的意思是这样试试:files={'file': in_file }?如果是这样,很遗憾它不起作用
  • 您也不能阅读该文件。顺便说一句,“它不起作用。”不是一个好的错误描述。
  • @KlausD。我照你说的做了,同样的错误{"detail": "No chunk file was submitted"}

标签: python python-3.x django file-upload django-rest-framework


【解决方案1】:

打开一个文件并以块的形式重复向服务器发出 PUT 请求。 要完成上传,请使用文件的校验和发出 POST 请求。

示例

import hashlib
import os

import requests
from requests.auth import HTTPBasicAuth

auth = HTTPBasicAuth(username='username', password='password')

file = 'prova.txt'

size = os.path.getsize(file)

hash_md5 = hashlib.md5()

CHUNK_SIZE = 100

with open(file, 'rb') as f:
    url = 'http://localhost:8000/'
    offset = 0
    for chunk in iter(lambda: f.read(CHUNK_SIZE), b''):
        hash_md5.update(chunk)
        res = requests.put(
            url,
            data={'filename': 'my_new_file'},
            files={'file': chunk},
            headers={
                'Content-Range': f'bytes {offset}-{offset + len(chunk) -1}/{size}'
            },
            auth=auth
        )
        offset = int(res.json().get('offset'))
        url = res.json().get('url')
    finalize = requests.post(url, data={'md5': hash_md5.hexdigest()}, auth=auth)
    print(finalize.status_code)
    print(finalize.json())

【讨论】:

  • 非常感谢您的回答,但是发送文件时服务器出现了新的错误。 ValueError: Cannot use ModelSerializer with Abstract Models.你知道这可能与什么有关吗?我没有更改源库的模型和视图。
  • 嗨..也许您正在使用来自 drf-chunked-upload 的 ChunkedUpload 模型作为摘要,检查此设置:DRF_CHUNKED_UPLOAD_ABSTRACT_MODEL
  • 设置为 False 并迁移。
  • 非常感谢。现在一切正常
猜你喜欢
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 2016-05-13
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多