2011-03-30 4 views
4

안녕 얘들 아. 기본적으로 사용자가 웹 페이지를 열고 양식의 확인란 목록에서 선택하고 양식이 제출되면 모든 파일을 함께 다운로드해야합니다. 주로 모바일 기기 단일 요청으로 여러 파일 다운로드 (jQuery/Python)

  • (우리는 모바일 장치가 지퍼를 처리 할 수 ​​있다고 가정 할 수 없기 때문에) 아니오 zip 파일
  • 파일 MUST

    • 플랫폼은 다음과 같습니다

      는 클라이언트 나에 부과 된 제한 사항입니다 다운로드 받아야하며 스트리밍되지 않음

    그래서 저는 프론트 엔드에 jQuery Mobile 1.0a3 및 백엔드에 Apache w/Python 2.6이 설치된 XHTML/CSS를 사용하여 웹 응용 프로그램을 만들었습니다. 다운로드 할 대상 파일은 .mp3 파일입니다.

    서버에서 전달되고 AJAX를 통해 jQuery에 의해로드 된 숨겨진 iframe을 사용하여 바탕 화면에 원하는 효과를 성공적으로 수행했지만 기본 Android 브라우저 또는 Dolphin 브라우저에서는 작동하지 않습니다. 그 문제가되지 않습니다, 그래서

    또한
    <Files *.mp3> 
        ForceType application/octet-stream 
        Header set Content-Disposition attachment 
    </Files> 
    

    , 아파치의 "헤더"모듈이 사용 가능합니다 ("헤더 설정"config 매개 변수에 필요한) :

    나는 나의 아파치 설정이 다운로드 동작을 강제로 확인했다.

    선택한 모든 항목을 매개 변수로 사용하여 서버에 AJAX 호출을하고 서버가 항목 배열을 읽으면 각 항목에 대한 정보를 데이터베이스에 쿼리합니다 (예 : 각 mp3 파일의 URL). 그런 다음 iframe 코드가 각 mp3 파일의 백엔드에서 생성 된 다음 jQuery의 $.load() 함수로 보내 져서 새 iframe (mp3을 다운로드 함)을로드합니다.

    붙여 넣기 너무 많은 코드없이

    , 여기의 매우 짧은 테스트 케이스 무엇 내가 뭘 :

    서버 측

    def download(req): 
        resultDiv = """<div id="downloads">""" 
        queryIds = [] 
        for element in req.form: 
         # "element" contains the id number that matches database record 
         trackId = re.match('^track(\d+)', element).group(1) 
         queryIds.append(trackId) 
    
        conn = MySQLdb.connect(host='localhost', user='fake', passwd='fake', db='fake') 
        cursor = conn.cursor() 
    
        buildQuery = """\ 
         SELECT filePath FROM tracks 
         WHERE trackNum in (""" 
    
        buildQuery += ','.join(queryIds) 
        buildQuery += ')' 
    
        cursor.execute(buildQuery) 
        downloadRows = cursor.fetchall() 
    
        for track in downloadRows: 
         resultDiv += """ 
          <iframe src="%s"></iframe> 
         """ % track[0] 
    
        return resultDiv 
    

    클라이언트 측

    <!DOCTYPE html> 
    <html> 
        <head> 
         <!-- INCLUDES FOR JQUERY MOBILE AND JQUERY --> 
         <style type="text/css"> 
          .invisible { 
           display: none; 
          } 
         </style> 
         <script type="text/javascript"> 
          $(document).ready(function() { 
           $('#albumForm').submit(function(e) { 
            e.preventDefault(); 
    
            // this will hold the selected items on the form 
            selTracks = {}; 
    
            $('#trackList').find(':checked').each(function() { 
             selTracks[this.id] = 'on'; 
            }); 
    
            // load the iframes into a 'div' set aside for that purpose 
            $('#results').load('control.py/download #tracks', selTracks); 
           }); 
          }); 
         </script> 
        </head> 
        <body> 
         <div data-role='page' id='page'> 
          <div data-role='header' id='header'> 
          </div> 
          <div data-role='content' id='content'> 
           <div id='container'> 
            <form id='albumForm'> 
             <div data-role='controlgroup' data-role='fieldcontain'> 
              <input type='checkbox' name='track1' id='track1' /> 
              <label for='track1' id='track1label'>Track 1</label> 
              <input type='checkbox' name='track2' id='track2' /> 
              <label for='track2' id='track2label'>Track 2</label> 
              <input type='checkbox' name='track3' id='track3' /> 
              <label for='track3' id='track3label'>Track 3</label> 
    
              <input type='submit' id='downloadButton' value='Download' /> 
             </div> 
            </form> 
           </div> 
           <div id='results' class='invisible'> 
           </div> 
          </div> 
          <div data-role='footer' id='footer'> 
          </div> 
         </div> 
        </body> 
    </html> 
    

    죄송합니다 코드는 너무 일반적이어서 (그리고 상당히 짧아진다), 나는 ctual 코드 (당신은 그것이 어떻게되는지 압니다). 그러나 이것은 기본적으로 그것의 요지입니다. 나는이 문제가 모바일 브라우저의 해석이나 어딘가의 HTTP 헤더 어딘가에있을 것이라고 생각한다. 이 작업은 Chrome 및 Firefox의 데스크톱에서 수행되며 Android 용 Fennec에서 실제로 예상대로 작동합니다 (더 이상 상호 작용하지 않고 모든 파일을 다운로드하고 알림 바에 표시). 나는 모든 사람들이 Fennec을 사용한다고 가정 할 수 없다.

    • JSON은 서버에서 반환하고, iframe을은 jQuery를
    • 하여 클라이언트에 생성 : 위 외에도

      , I (모든되지 모바일 바탕 화면에 근무하지만이있는) 다음과 같은 노력했습니다

    • JSON은 서버에서 반환, 그리고에 대한 루프는
    • JSON 서버에서 반환 된 각 URL에 대한 window.open()를 호출 jQuery를 만든 <a> 태그와 click()
    • 를 사용하여 다른 트리거 (

      • 서버에 req.sendfile()를 호출 location.href 또는 window.location (분명히, 한 번 할 경우에만 가능)
      • 수정 :적인 doctypes

      것은 여기에 내가 데스크톱 또는 모바일 중 하나가 작동하지 않았다 시도 무엇 어쩌면 내가 잘못하고있는 거지?)

    • 서버에서 설정된 경계를 가진 multipart/form-data 및 덤프 바이너리 데이터를 반환합니다. (아주 엉망입니다.)이 메시지는 잘못된 것입니까?

    아직 기쁨이 없습니다. 나는 무엇을 놓칠 수 있 었는가?

    P. 숨겨진 iframe을 사용하여 나를 화나게하지 마십시오 ...

    EDIT : FTP와 같은 서버에서 설정할 수있는 다른 기본 브라우저 프로토콜을 사용해도 괜찮습니다. 모든 아이디어를 환영합니다.

    업데이트 : 클라이언트에서 서버로 FTP 연결을 시작하고 "mget"을 실행하려고합니다. net2ftp가이 작업을 수행 할 수 있다는 것을 알고 있습니다 ... 이제는 그것을 파악하십시오.) 새로운 아이디어가 아직 남아 있습니다.

  • +0

    당신은'

    관련 문제