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

안드로이드 멀티파트 파일 업로드관련 질문드립니다

0 추천

현재 멀티파트를 이용해서 서버로 파일 업로드 기능을 구현하고 있는데요

.txt파일이나 .ppt파일은 정상적으로 업로드 되는데 .xlsx파일과 .docx파일은 업로드하면 파일이 깨집니다

혹시 따로 라이브러리 같은게 필요한가요?? 업로드 소스 첨부하겠습니다

조언 부탁드리겠습니다

감사합니다

private void uploadFilePart() throws IOException {
		String fileName = new File(uploadFile).getName();
		Log.d(TAG, "AndroidUploader uploadFilePart(), uploadFilePart call !!! uploadFile : " + uploadFile + ", fileName : " + fileName);
        writer.writeBytes("--" + boundary + LINE_FEED);
        writer.writeBytes(
                "Content-Disposition: form-data; name=\"" + FIELD_NAME
                        + "\"; filename=\"" + fileName + "\"" + LINE_FEED);
        
        writer.writeBytes("--" + boundary + LINE_FEED);
        writer.writeBytes(
                "Content-Type: application/octet-stream" + LINE_FEED);
        writer.writeBytes("--" + boundary + LINE_FEED);
        
        writer.writeBytes("Content-Transfer-Encoding: binary" + LINE_FEED);
        writer.writeBytes("--" + boundary + LINE_FEED);
        writer.writeBytes(LINE_FEED);
        writer.flush();

        FileInputStream fis = new FileInputStream(new File(uploadFile));
        BufferedInputStream bis = new BufferedInputStream(fis);
        byte[] buffer = new byte[BUFFER_SIZE];
        int bytesRead = -1;
        while ((bytesRead = bis.read(buffer)) != -1) {
        	writer.write(buffer, 0, bytesRead);
        }
        bis.close();
        writer.writeBytes(LINE_FEED);
        writer.flush();
	}

 

우랴 (3,680 포인트) 님이 2017년 7월 21일 질문

2개의 답변

0 추천
코드상은 문제가 없는 것 같습니다.

txt, ppt 가 잘 올라간다면, 다른 파일도 잘 올라가야 할텐데...

전송 실패가 되어서 중간에 끊겼거나,  서버쪽에서 더미 같은 것을 붙였다고 밖에 생각이 안되네요..

 

원본과 전송된 파일을 헥사 비교 해보시고 다를 경우 서버쪽 코드를 살펴 보셔야 할 듯 합니다.
익명사용자 님이 2017년 7월 21일 답변
답변 감사드립니다. 서버쪽도 확인해보겠습니다
0 추천
의심되는 곳이 몇군데 있네요.

-writer.flush()는 맨 마지막에만 쓰는 것이 좋을 듯 싶네요. 파일 사이즈가 큰 경우에는 파일 본문이 너무 늦게 갈 수 있을 듯.

-uploadFile이 전역으로 선언된 것인가요? 전역으로 선언되어 있으면 어느 순간에 바뀔 수도 있는데, 파라미터로 넘겨 받는 게 좋을 것 같네요.

-마지막에 LINE_FEED를 한번더 보냈는데요. 제가 알기로는 HTTP BODY 끝에 LINE_FEED를 넣지 않습니다.

멀티파트라서 다른가요?

마지막으로 멀티파트 업로드를 해 주는 많은 툴들이 있는데, 왜 굳이 직접 업로드 하는지요? OKHTTP나 Retrofit2 같은 도구를 잘 사용하시기 바랍니다.
Will Kim (43,170 포인트) 님이 2017년 7월 22일 답변
답변 감사드립니다.
라이브러리를 사용하는데 제한이 있어서 사용 못 하고 있습니다 ㅠㅠ
소스 수정 해서 테스트 해보겠습니다
...