Django
1.3是可以接受的。因此,我可以使用request.raw_post_data或request.read()做一些事情(或其他一些更好的访问方法)。有任何想法吗?
您不希望碰触
request.raw_post_data-这意味着将整个请求正文读入内存,如果您谈论的是文件上传,那么可能很多
request.read()。您也可以使用Django
<=
1.2来做到这一点,但这意味着要深入研究
HttpRequest以找出使用私有接口的正确方法,这是一个真正的负担,然后确保您的代码也将与Django> =
1.3兼容。 。
我建议您要做的是复制该类的现有文件上传行为部分
MultiPartParser:
- 从中检索上传处理程序
request.upload_handlers
(默认情况下为MemoryFileUploadHandler
&TemporaryFileUploadHandler
) - 确定请求的内容长度(搜索Content-Length
HttpRequest
或MultiPartParser
查看正确的方法。) - 确定上载文件的文件名,方法是让客户端使用url的最后一个路径部分来指定它,或者让客户端在
Content-Disposition
标头的“ filename =”部分中指定它。 - 对于每个处理程序,请
handler.new_file
使用相关的args进行调用(模拟字段名称) - 使用
request.read()
并调用handler.receive_data_chunk()
每个块,以块的形式读取请求主体。 - 对于每个处理程序调用
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!


