2017-02-22 113 views
0

В моем проекте django для загрузки файла используется следующий код. Он работает хорошо, если на клиентской машине был установлен IDM, но не работает, если IDM не установлен. Я не мог найти причины для этой странности.Django download не работает с браузером, но отлично работает в машинах, где установлен Internet Download Manager (IDM)

views.py

def somefunction(): 
     something something 
     return render(request, 
         'something/download/download.html', 
         {'pdf_file_location': pdf_file_location}) 
def download(request): 
if not request.user.is_authenticated(): 
    return render(request, 'login/login/login.html') 
else: 
    filename = request.POST.get('pdf_file_location') 
    if request.method == 'POST': 
     while os.path.exists(filename) is False: 
      time.sleep(2) 
     chunk_size = 8192 
     response = StreamingHttpResponse(FileWrapper(open(filename, 'rb'), chunk_size), 
             content_type=mimetypes.guess_type(filename)[0]) 
     response['Content-Length'] = os.path.getsize(filename) 
     response['Content-Disposition'] = "attachment; filename=%s" % filename[filename.find("UserSessionDetails-")+19:] 
     return response 
    return render(request, 'something/something/index.html') 

download.html

<canvas id="c-timer" width="300" height="300"> 
    <input id="pdf_file_location" type="hidden" value={{ pdf_file_location }} name="pdf_file_location"/> 
</canvas> 

JS для download.html

var val = document.getElementById('pdf_file_location').value 
data ={"pdf_file_location": val}; 
something something and then finishTime is called 
var finishTime = function() { 
     $.post("/book_publish/download/",data); 
     }; 

У меня нет много знаний о том, как IDM работает, но чтение this article говорит мне, что он не должен давать никаких преимуществ, кроме того, что он открывает несколько co nnections для операции, а мой код отправляет данные в куски. Неужели браузер не может сшить данные, когда он отправлен небольшими кусками?

ответ

0

ПРОБЛЕМА: Проблема была в том, что я использовал JS для отправки запроса на загрузку, а так как я новичок в Интернете, поэтому я не мог обработать запрос, отправленный обратно. Значит, все испортилось.

И как-то IDM смог поймать этот ответ и инициировать процесс загрузки.

РЕШЕНИЕ: Я использовал простую форму поста и кнопку представить в самом HTML, а не использовать JS для запроса поста.