마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

웹뷰 파일 다운로드 질문입니다.

0 추천

DownloadListener 을 사용해서 파일을 다운로드 받으려고 하는데.

웹뷰에서 다운로드를 누르면 php소스로 이동합니다. 거기서 이제 파일다운로드를 시키는데

php의 http://php.net/manual/en/function.fpassthru.php 이부분을 이용해서 다운로드 시키고 있는 것 같습니다.

웹은 정상적으로 되는데

앱에서는 파일명이나 헤더정보는 잘 날라오는데

파일이 다운로드 받아지질 않습니다 .

파일을 50바이트 다운받고 완료라고 하는걸 보아하니 다운로드 받을 파일이 없는것같은데...

카카오톡이나 네이버 내장브라우저에서는 정상적으로 다운로드 되는데 

왜 앱에서는 안되는지 모르겠습니다.

 

http://dl.google.com/android/adt/adt-bundle-windows-x86-20131030.zip

 

근데 다운로드 소스 자체는 문제가 없다고 판단한게 저 url은 정상적으로 다운로드 받아집니다.

 

DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setMimeType(mimetype);
request.addRequestHeader("User-Agent", userAgent);
request.setDescription("Downloading file");
request.setTitle(URLUtil.guessFileName(url,contentDisposition,mimetype));
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, URLUtil.guessFileName(url,contentDisposition,mimetype));
DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
dm.enqueue(request);
Toast.makeText(getApplicationContext(), "Downloading File", Toast.LENGTH_LONG).show();

 

header('Content-Type: ' . $this->mimetype);
		header('Content-Disposition: attachment; filename="' . $this->dl_filename . '"');
		header("Content-Transfer-Encoding: binary");
		header('Accept-Ranges: bytes');

		/* The three lines below basically make the
		download non-cacheable */
		header("Cache-control: private");
		header('Pragma: private');
		header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

		// multipart-download and download resuming support
		if(isset($_SERVER['HTTP_RANGE']) && !$this->force_single){
			list($a, $range) = explode("=", $_SERVER['HTTP_RANGE'], 2);
			list($range) = explode(",", $range, 2);
			list($range, $range_end) = explode("-", $range);

			$range = intval($range);

			if(!$range_end){
				$range_end = $size - 1;
			}else{
				$range_end = intval($range_end);
			}

			$new_length = $range_end - $range + 1;
			header('HTTP/1.1 206 Partial Content');
			header('Content-Length: ' . $new_length);
			header('Content-Range: bytes ' . $range . '-' . $range_end . '/' . $size);

			//set the offset range
			$this->mt_range = $range;
		}else{
			$new_length = $size;
			header("Content-Length: " . $size);
		}

 

정에약한마음 (1,160 포인트) 님이 2016년 12월 6일 질문

2개의 답변

0 추천

public DownloadManager.Request setDestinationUri (Uri uri)
다운로드할 파일이 저장될 경로를 지정합니다. 외부 미디어(예:SD카드)의 경로여야 하며, 외부 미디어에 데이터를 쓰기 위해WRITE_EXTERNAL_STORAGE 권한을 지정해야 합니다

혹시 권한지정 하셨나요?

익명사용자 님이 2016년 12월 7일 답변
넵 권한지정은 정상적으로 되어있습니다
0 추천
저같은경우는

public boolean shouldOverrideUrlLoading(WebView view, final String url) {
            if(url.endsWith(".hwp") ){

Uri source = Uri.parse(url);
                DownloadManager.Request request = new DownloadManager.Request(source);
                request.setDescription("");
                request.setTitle("이름");
                if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
                    request.allowScanningByMediaScanner();
                    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);    
                }
                request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "test.hwp");
                DownloadManager manager = (DownloadManager)getSystemService(mcontext.DOWNLOAD_SERVICE);
                manager.enqueue(request);
                return true;

}

 

이런식으로 url 마지막이 마임타입일때 다운로드하게끔 하는데 이방식은 어떠신지여
sadeva (21,550 포인트) 님이 2016년 12월 7일 답변
아쉽게도 파일을 직접다운받는게아니라 사이트내에서 다운을 받는거라 저런방식은 불가능 할 뿐더러 다른 파일들은 정상적으로 다운받아 지는데 저희 사이트의 파일만 안받아지는거라서요... 또 사이트에서 제공하는 방식이 잘못됫다 하기에는 카카오톡이나 삼성브라우저는 잘 되더라구요 ㅠㅠ
...