나는 이걸 어떻게 사용하는지 알아내는 데 흥미가있을 것입니다. 그것은 제가 스스로를 들여다 본 것의 의미였습니다. 어떻게 움직이는 지 알려 주시면 감사하겠습니다. Ninefingers의 요청에 따라에 의해
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
매개 변수가 무엇인지, 소스가 많은 단서를 제공하지 않았는지 확실하지 않습니다.
아래에서 일어나는 일은 실제로 보이는 것보다 훨씬 간단합니다. 처리기가 원시 입력을 처리 할 것인지 각 처리기에 요청합니다. 위 국가의 저자는 기본적으로 MemoryFileUploadHandler
& TemporaryFileUploadHandler
입니다. 글쎄, new_file
을 만들지 묻는 메시지가 나타나면 MemoryFileUploadHandler
이 나오고 다양한 설정에 따라 파일을 처리할지 여부를 결정합니다. 그것이 진행될 것이라고 결정하면 예외를 throw합니다. 그렇지 않으면 파일을 만들지 않고 다른 핸들러를 인계받습니다.
counters
의 목적은 무엇인지 모르겠지만 소스에서 보관 해 두었습니다. 나머지는 간단해야합니다.
if request.content_type.startswith('multipart'):
put, files = request.parse_file_upload(request.META, request)
request.FILES.update(files)
request.PUT = put.dict()
else:
request.PUT = QueryDict(request.body).dict()
이처럼 파일 및 기타 데이터에 액세스 할 수 있도록 :이 같은 주어진 솔루션을 수정
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!
+1 감사합니다. 내가 직장에 돌아 왔을 때 나는 그것을 줄 것이다. 나는 그 결과를보고 할 것이다. –
그것은 매력처럼 작동했고, 나는 하루의 끝에 당신의 대답으로 그것을 편집 할 것입니다. 요청한대로 –
을 입력하고 대답에 대한 코드를 편집했습니다. 개선 된 점이 있다면 자유롭게 편집 할 수 있습니다. 게시물에서 파생 된 작업으로 내 질문에 답변하고 싶지 않습니다. –