Hi Hi

'sl4a 파일 내려 받기'에 해당되는 글 1건

  1. Python sl4a - 웹에서 파일 내려 받기

Python sl4a - 웹에서 파일 내려 받기

 

웹에서 파일을 안드로이드 기기의 특정 디렉터리로 내려 받기가 생각만큼 쉽지 않은 경우가 있다.

파일 전송 작업의 대부분은 파이썬의 표준라이브러리 모듈들 중 하나인 urllib로 처리한다.

안드로이드의 클립보드에서 파일 주소를 가져온다. 기본적으로 모든 파일이 SD 카드의 한 디렉토리(/sdcard/download)에 저장된다. 그리고 파일이 전송되기 전에 사용자가 파일 이름을 변경할 수 있다.

이 스크립트에서 주목할 만한 또 다른 부분은 잘 작동하는 진행 표시 대화상자이다.

urlretrieve 함수는 필수 매개변수 하나와 생략 가능한 매개변수 세개를 받는다.

첫 매개변수는 내려 받을 파일의 URL이다. URL을 모르면 함수가 작업을 진행할 수 없으므로, 이 매개 변수는 필수 이다.

둘째 매개변수는 내려 받을 파일을 저장할 파일 이름이다.

셋째 매개 변수는 패이썬 문서화에서는 reporthook 이라고 부르는 콜백 함수 참조이다. urlretrieve는 네트워크 연결이 성립했을 때와 파일의 한 블록을 다 읽을 때마다 이 콜백 함수를 호출해 준다.

호출 시 세 개의 매개변수들이 전달되는데, 차례로 지금까지 전송된 블록 개수, 블록 하나의 크기, 그리고 전송할 파일의 전체 크기이다. 이러한 콜백 함수 메커니즘 덕분에 파일 전송 진행 상황을 보여주는 진행 표시 대화 상자를 손쉽게 구현할 수 있다.

import android
import urllib
import os

download = '/sdcard/download'

def _reporthook(numblocks, blocksize, filesize, url=None):
    base = os.path.basename(url)
    try:
        percent = min((numblocks*blocksize*100)/filesize, 100)
    except:
        percent = 100
    if numblocks != 0:
        droid.dialogSetMaxProgress(filesize)
        droid.dialogSetCurrentProgress(numblocks * blocksize)

def main ():
    global droid
    droid = android.Android()

    url = droid.getClipboard().result
    if url is None: return

    dst = droid.dialogGetInput('파일이름', '다른 이름으로 저장:', os.path.basename(url)).result
    droid.dialogCreateHorixontalProgress('내려 받는 중...','웹에서 %s 파일을 받고 있습니다.' %dst)
    droid.dialogShow()
    urllib.urlretrieve(url, download+dst, lambda nb, bs, fs, url=url: _reporthook(nb,bs,fs,url))
    droid.dialogDismiss()

    droid.dialogCreateAlert('작업 완료',' %s 파일에 %s에 저장 되 었습니다.' %(url, download+dst))
    droid.dialogSetPositiveButtonText('확인')
    droid.dialogShow()

if __name__ == '__main__':
    main()