2013-08-14 2 views
3

내 웹 페이지에는 파일을 다운로드 할 수있는 버튼이 있습니다. 다운로드 할 파일이 없다면 같은 페이지에 머무르는 동안 메시지를 표시하고 싶습니다.첨부 파일 다루기 jquery.ajax

function downloadFile(id) { 
    window.location = '/myapp.com/download_file/' + id; 
} 

내 서버가 응답 본문에 파일 내용을 기록하고 '첨부 파일'에 세트 '내용 - 처리'헤더 : 다운로드 할 수있는 파일 (ID가 파일 ID입니다)이있을 때 다음 자바 스크립트 코드가 작동합니다.

이제 파일이 없으면 다운로드 할 파일이 없다는 내용의 텍스트를 반환하고 싶습니다. 그래서 아래와 같은 일을하고 싶습니다 :

function downloadFile(id) { 
    $.ajax({ 
     url: '/myapp.com/download_file/' + id, 
     success: function() { 
      //if (attachemnt) { 
      // download file: just pass response to the browser? 
      //} else { 
      // show error text 
      //} 
     }, 
     error: function() { 
      //show error message 
     } 
    }); 
} 

그래서, 내 질문은 :

  1. 어떻게 위의 기능을 구현할 수 있습니다?
  2. 특히, 응답에 첨부 파일이있는 경우 브라우저가 파일 다운로드를 처리 할 수 ​​있도록 브라우저에 응답을 전달할 수 있습니까?

UPDATE : 내가 처리 할 수있는 지금 '없는 파일'사건 :

$.ajax({ 
    url: '{{ path('download_prev_other_data', {'other_data_id':form.vars.value.getOtherDataId() }) }}', 
    success: function (data, textStatus, jqXHR) { 
     var header = jqXHR.getResponseHeader('Content-Disposition'); 
     if (header && header.indexOf('attachment') === 0) { 
      //pass the original response to the browser 
     } else { 
      alert(data); //data is just text in my case explaining there was no file 
     } 
    }, 
    error: function (jqXHR, textStatus, errorThrown) { 
     alert(errorThrown); 
    } 
}); 

그래서, 내 두번째 질문은, "브라우저에 원래의 응답을 전달하는 방법"아직 대답하지 않습니다. 이

답변

1

는 소스 코드와 함께이 준비 플러그인은 다음과 같습니다 jquery.fileDownload.js Library

+0

예, 나는 이것을 알고있다. 방금 추가 라이브러리없이 갈 수 있다고 생각했습니다. – synergetic

+1

@synergetic 그런 다음 게시물에서 Idon't이 플러그인을 사용하고 싶다고 언급해야합니다. –

+0

@synergetic 데스크톱과 모바일 브라우저 (예 : iOS의 일부 버그)를 처리해야하기 때문에 이러한 기능을 처음부터 작성하는 것은 정말로 어렵습니다. 위의 플러그인의 전체 소스 코드를 보려면 https://github.com/johnculviner/jquery.fileDownload/blob/master/src/Scripts/jquery.fileDownload.js를 참조하십시오. 그것은 iframe을 숨기고 그것을 사용하여 comunicates 사용하고 있습니다 –

0

당신 수 없습니다 파일 다운로드 사용 아약스 표준 브라우저 가능성에 의존하고 있습니다. 가장 좋은 해결책은 숨겨진 iframe을 사용하는 것입니다.
비어있는 내용으로 페이지 시작시 iframe을 만들고 비어있는 경우 src을 만듭니다. 다음 파일을 다운로드 할 때 파일 url로 iframe의 src을 업데이트하면됩니다. load 이벤트 핸들러를 iframe으로 준비해야하기 전에 처리기는 iframe 콘텐츠 (예 : 본문)에서 오류 메시지를 확인해야합니다. 그렇다면 맞춤 메시지를 표시 할 수 있습니다.
브라우저가 자동으로 처리하고 '다른 이름으로 저장'대화 상자가 표시되므로 성공을 처리 할 수 ​​없습니다 (afaik).

참고 : $('#frame').contents().find('body') :

  • 가 iframe을 몸 사용을 얻을 수 있습니다.
  • load 이벤트가 iframe에 대한 트리거 될 때 브라우저에 의존의 - 메인 페이지가로드 된 후도 그것을 처리 할 준비가되어 (빈/초기 iframe 상태)

난 당신이 또한 다른 요청을 사용하여 고려할 수 있다는 생각은 다운로드 첨부 파일에 대한 확인은 &입니다. POST 요청을 확인하고 서버 측에서 첨부 파일을 찾을 수 있는지 확인하십시오. 그렇다면 응답 상태를 확인한 다음 클라이언트 측에서 GET 요청을 사용하여 검색 첨부 파일을 찾습니다. 이 경우 일반적으로 window.open으로 파일을 다운로드 할 수 있습니다. 브라우저는 GET 요청을 보내고 다운로드를 처리합니다.

참고 :
아래처럼 첨부 파일 콘텐츠의 응답 헤더를 보낼 기억
"Content-Disposition", "attachment; filename=yourFileName"