您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何在Django中通过PUT请求处理文件上传?

如何在Django中通过PUT请求处理文件上传?

Django 1.3是可以接受的。因此,我可以使用request.raw_post_data或request.read()做一些事情(或其他一些更好的访问方法)。有任何想法吗?

您不希望碰触request.raw_post_data-这意味着将整个请求正文读入内存,如果您谈论的是文件上传,那么可能很多request.read()。您也可以使用Django <= 1.2来做到这一点,但这意味着要深入研究HttpRequest以找出使用私有接口的正确方法,这是一个真正的负担,然后确保您的代码也将与Django> = 1.3兼容。 。

我建议您要做的是复制该类现有文件上传行为部分MultiPartParser

我如何推断正在发送的内容的MIME类型?如果我做对了,那么PUT主体就是没有前奏的文件。因此,我是否要求用户在其标题中指定mime类型?

让客户端在Content- Type标头中指定它,或者使用python的mimetype模块猜测媒体类型

我很想了解您如何进行此操作-这是我一直在研究自己的意思,如果您能发表评论以告知我进展如何,那就太好了!

根据要求进行 ,这是我所做的,并且完全基于上述内容和django来源。

upload_handlers = request.upload_handlers
content_type   = str(request.Meta.get('CONTENT_TYPE', ""))
content_length = int(request.Meta.get('CONTENT_LENGTH', 0))

if content_type == "":
    return HttpResponse(status=400)
if content_length == 0:
    # both returned 0
    return HttpResponse(status=400)

content_type = content_type.split(";")[0].strip()
try:
    charset = content_type.split(";")[1].strip()
except IndexError:
    charset = ""

# we can get the file name via the path, we don't actually
file_name = path.split("/")[-1:][0]
field_name = file_name

由于我在此处定义API,因此不必担心跨浏览器的支持。就我的协议而言,不提供正确的信息是一个无效的请求。关于是否要说image/jpeg; charset=binary或是否允许不存在的字符集,我有两种想法。无论如何,我将设置Content-Type有效地视为客户端的职责。

同样,对于我的协议,文件名是传入的。我不确定该field_name参数用于什么,并且源代码没有提供很多线索。

实际上,下面发生的事情比看起来简单得多。您询问每个处理程序是否将处理原始输入。如上述声明所述,认情况下,您有MemoryFileUploadHandlerTemporaryFileUploadHandler。好吧,事实证明,MemoryFileUploadHandler当被要求创建一个new_file决定是否将处理文件的决定时(基于各种设置)。如果它决定将要执行的操作,则将引发异常,否则将不会创建该文件,并让另一个处理程序接管该文件

我不确定目的counters是什么,但是我从源头上保留了它。其余的应该很简单。

counters = [0]*len(upload_handlers)

for handler in upload_handlers:
    result = handler.handle_raw_input("",request.Meta,content_length,"","")

for handler in upload_handlers:

    try:
        handler.new_file(field_name, file_name, 
                         content_type, content_length, charset)
    except StopFutureHandlers:
        break

for i, handler in enumerate(upload_handlers):
    while True:
        chunk = request.read(handler.chunk_size)
        if chunk:

            handler.receive_data_chunk(chunk, counters[i])
            counters[i] += len(chunk)
        else:
            # no chunk
            break

for i, handler in enumerate(upload_handlers):
    file_obj = handler.file_complete(counters[i])
    if not file_obj:
        # some indication this didn't work?
        return HttpResponse(status=500) 
    else:
        # handle file obj!
Go 2022/1/1 18:32:15 有437人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶