>source

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 )
            });
    });
 });

  • 답변 # 1

    아약스 (XHR) 요청을 통해 파일을 컴퓨터로 다운로드 할 수 없습니다. 따라서 사용자를 실제로 리디렉션해야합니다 ( window.location 설정) ) 파일을 다운로드하는보기로 이동하십시오. 또는 성공적인 POST 결과로 현재 페이지에 단추를 추가하여 사용자가 파일을 다운로드 할 수 있습니다. 어쨌든 표준 GET 요청이 파일을 가져올 수 있도록 파일 다운로드를 다른보기로 이동해야합니다.

    하지만 장고에서 파일을 반환하는 코드 ( FileResponse 사용) )가 맞습니다.

    여기서 다른 방법으로 설명하는 것도 있습니다

  • 답변 # 2

    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
    
    

  • 이전 node.js - NodeJ의 fs 메소드를 사용하여 서버 경로에서 파일을 읽을 수 있습니까?
  • 다음 google cloud platform - 메모리 저장소에 대한 간단한 API 인 App Engine 및 Compute Engine