栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在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

  1. 从中检索上传处理程序
    request.upload_handlers
    (默认情况下为
    MemoryFileUploadHandler
    TemporaryFileUploadHandler
  2. 确定请求的内容长度(搜索Content-Length
    HttpRequest
    MultiPartParser
    查看正确的方法。)
  3. 确定上载文件的文件名,方法是让客户端使用url的最后一个路径部分来指定它,或者让客户端在
    Content-Disposition
    标头的“ filename =”部分中指定它。
  4. 对于每个处理程序,请
    handler.new_file
    使用相关的args进行调用(模拟字段名称)
  5. 使用
    request.read()
    并调用
    handler.receive_data_chunk()
    每个块,以块的形式读取请求主体。
  6. 对于每个处理程序调用
    handler.file_complete()
    ,如果它返回一个值,那就是上载的文件。

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

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

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


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

upload_handlers = request.upload_handlerscontent_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 actuallyfile_name = path.split("/")[-1:][0]field_name = file_name

由于我在此处定义API,因此不必担心跨浏览器的支持。就我的协议而言,不提供正确的信息是一个无效的请求。关于是否要说

image/jpeg;charset=binary
或是否允许不存在的字符集,我有两种想法。无论如何,我将设置
Content-Type
有效地视为客户端的职责。

同样,对于我的协议,文件名是传入的。我不确定该

field_name
参数用于什么,并且源代码没有提供很多线索。

实际上,下面发生的事情比看起来简单得多。您询问每个处理程序是否将处理原始输入。如上述声明所述,默认情况下,您有

MemoryFileUploadHandler
TemporaryFileUploadHandler
。好吧,事实证明,
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:        breakfor 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 breakfor 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!


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/653118.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号