Автоматическая загрузка не работает для Django FileResponse - PullRequest
0 голосов
/ 22 мая 2019

Мне нужно разрешить Django автоматически загружать сгенерированный файл.

Перепробовал все разные решения онлайн, ни одно из них не работает.

Views.py

def validate(request):
    if request.method == 'POST':
        filename = request.POST.get('source_file')
        file_path = os.path.join(settings.MEDIA_ROOT, 'SourceFiles', filename)
        region = request.POST.get('region')
        product_type = request.POST.get('product_type')
        result = validateSource.delay(file_path, region, product_type)
        output_filepath, log_filepath = result.get()
        if os.path.exists(output_filepath) and os.path.exists(log_filepath):
            zip_filename = zipFiles([output_filepath, log_filepath], filename)
            zip_filepath = os.path.join(settings.MEDIA_ROOT, zip_filename)
            response = FileResponse(open(zip_filepath, 'rb'), as_attachment=True)
            return response
        raise Http404

Шаблон: код для формы POST.

     $(document).on('submit', '#productForm', function(e){
       e.preventDefault();
       var inputFilePath = document.getElementById('sourceFileInput').files.item(0).name;
        $.ajax({
            method: 'POST',
            url: 'validate/',
            data: {
              source_file: inputFilePath,
              region: $("#Region-choice").val(),
              product_type: $("#Product-type").val()}
            })
            .done(function(){
                document.getElementById('lblStatus').innerHTML = "Result: <br/>"
                document.getElementById('lblStatusContent').innerHTML = "Success!"

            })
            .fail(function(req, textStatus, errorThrown) {
                document.getElementById('lblStatus').innerHTML = "Result: <br/>"
                alert("Something went wrong!:" + textStatus + '  ' + errorThrown )
            });
    });
 });

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Невозможно загрузить файлы на компьютер через запрос ajax (XHR).Таким образом, вам необходимо перенаправить пользователя (настройка window.location) на представление, которое загружает файл.Или вы можете добавить в результате успешного POST кнопку текущей страницы, чтобы пользователь мог загрузить файл.В любом случае вам необходимо переместить загружаемый файл в другое представление, чтобы его мог получить стандартный запрос GET.

Но ваш код для возврата файла в Django (с использованием FileResponse) правильный.

Существует также объяснение альтернативного способа сделать это здесь

0 голосов
/ 22 мая 2019
def validate(request):
    if request.method == 'POST':
        filename = request.POST.get('source_file')
        file_path = os.path.join(settings.MEDIA_ROOT, 'SourceFiles', filename)
        region = request.POST.get('region')
        product_type = request.POST.get('product_type')
        result = validateSource.delay(file_path, region, product_type)
        output_filepath, log_filepath = result.get()
        if os.path.exists(output_filepath) and os.path.exists(log_filepath):
            zip_filename = zipFiles([output_filepath, log_filepath], filename)
            zip_filepath = os.path.join(settings.MEDIA_ROOT, zip_filename)
            with open(zip_filepath, 'rb') as fh:
                response = HttpResponse(fh.read(), content_type="application/force-download")
                response['Content-Disposition'] = 'attachment; filename=' + os.path.basename(zip_filepath)
                return response
        raise Http404
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...