2013-11-19 6 views
0

На сервере django обрабатываю загруженные zip-файлы, отправленные из сценария python. Но я получаю «" (пустую строку) для file.content_type. Что я делаю не так?не удалось обнаружить запрос content_type

@csrf_exempt 
def Import(request): 
    if request.method != 'POST': 
     return HttpResponseNotAllowed('Only POST here') 

    if not request.FILES or not request.FILES.get(u'file'): 
     return HttpResponse('Must upload a file') 
    file = request.FILES[u'file'] 
    if file.content_type == 'application/zip': 
     unzipped_dir = unzip_file(file) 

     uid = create_project(unzipped_dir) 

     shutil.rmtree(unzipped_dir) 
     py_ob = { } 
     py_ob['success'] = uid is not None 
     if uid is not None: 
      py_ob['id'] = uid 
     json_ob = simplejson.dumps(py_ob) 
     return HttpResponse(json_ob, mimetype="application/json") 
    else: 
     return HttpResponseNotAllowed('Only POST zip files here') 

Это скрипт, который отправляет почтовый файл до:

import sys 
import os 
import requests 

if len (sys.argv) < 5: 
    print "pass in url, username, password, file" 
else: 

    url = sys.argv[1] 
    username = sys.argv[2] 
    password = sys.argv[3] 
    phile = sys.argv[4] 
    if os.path.exists(phile): 
     files = {'file': open(phile, 'rb')} 
     r = requests.post(url, files=files, auth=(username, password)) 
     if r.status_code == 200: 
      json_response = r.json() 
      if json_response['success']: 
       print "id: " + str(json_response['id']) 
      else: 
       print "failure in processing bundle" 
     else: 
      print "server problem: " + str(r.status_code) 
      print r.text 
    else: 
     print "cannot find file to upload" 

ответ

1

Заголовок Content-Type является completely arbitrary (и необязательно), а не хороший способ выяснить, действительно ли вы имеете дело с действительным ZIP-файлом. Вы уверены, что ваш браузер его снабжает?

Django's documentation говорит нам то же самое:

UploadedFile.content_type Содержание типа заголовка загружено с файлом (например, текст/простой или применение/PDF). Как и любые данные, предоставленные пользователем, вы не должны полагать, что загруженный файл на самом деле является типом. Вы все еще будете нуждаться в , чтобы проверить, что файл содержит контент, что претензии типа содержимого заголовка - «Доверяй, но проверяй»

Вы должны использовать zipfile.is_zipfile вместо этого.

+0

Спасибо - ваш ответ привел меня к этому фрагменту, который обрабатывает is_zipfile для file_pointers. https://github.com/pculture/django-uploadtemplate/blob/master/uploadtemplate/utils.py#L58 – jedierikb

Смежные вопросы