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

Retrofit2 File전송 질문입니다.

0 추천
@Multipart
@POST("user/update/basicinfo")
Call<CommonApiData> setUserBasicInfo(@PartMap Map<String, RequestBody> temp_map,@Part MultipartBody.Part file);
RequestBody fileBody = null;
MultipartBody.Part body = null;
if(!mstuvApplication.loginObject.get("profile_img").getAsString().equals(profile_img)) {
    try {
        File file = new File(convertContentToFileUri(Uri.parse(profile_img)).toString());
        fileBody = RequestBody.create(MediaType.parse("image/*"), file);
        body = MultipartBody.Part.createFormData("profile_img", file.getName(), fileBody);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

[ProfileFragment$2.onFailure():161]file:/storage/emulated/0/Download/1982298427_428b531b_B5ACEBAFB829.jpg (No such file or directory)

 

 이런식으로 하여 파일을 던지는데 MultipartBody가 아닌 RequestBody에 넣어서 다른 정보와 같이 맵에 넣어서 던져도 보고 일반적으로 던져도 봤는데 서버통신을 하면 그러니 통신을 하다가 에러가 나고있습니다 onFailue 에서요파일낫파운드 에러가 납니다 ㅠㅠ 도대체 이유가 뭘까요

어떤게 잘못된건가요?? 서버통신은 간단하게 enqueue를 통해서 하고있습니다.

 

 

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

2개의 답변

0 추천
 
채택된 답변

서버 통신에서 에러가 난게 아닐 겁니다.

서버 통신 전에 아래 코드를 한줄 추가해서 파일이 존재하는지 확인해 보세요.

if(file.exists()) {

상기 부분에서 디버깅해서 아래처럼, 파일 경로가 맞는지 확인해 보세요.

filePath에 아래처럼 나오는지 확인해 보세요. fileUri에는 "file:///" 이게 들어가는 게 맞지만, filePath는 "/storage/"로 시작해야 합니다.

디버그 화면

Will Kim (43,170 포인트) 님이 2017년 6월 29일 답변
정에약한마음님이 2017년 6월 29일 채택됨
이 답변을 보기전에 저도 정답을 찾았지만 정확하게 문제를 알려주셔서 감사합니다
확인해보니 파일패스 자체가 file:// 이 붙어서 나오더라구요
그래서 URI 넣을때 file:/ 부분을 삭제하고 넣으니 정상적으로 통과했습니다 감사합니다 ㅠㅠ
thumbup 아이콘이 안달리네요~ retrofit2 너무 좋습니다.
0 추천
로직은 맞는 것 같은데요. 해당 폴더에 파일이 있는지 확인해 보세요.

가끔씩 파일 명이나 폴더명을 잘못해서 오류가 나기도 하죠.

/storage/emulated/0/Download/1982298427_428b531b_B5ACEBAFB829.jpg
Will Kim (43,170 포인트) 님이 2017년 6월 28일 답변
저 부분은 있는파일입니다
Intent intent = new Intent(Intent.ACTION_PICK);
                intent.setType(android.provider.MediaStore.Images.Media.CONTENT_TYPE);
                intent.setData(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(intent, REQ_CODE_SELECT_IMAGE);
이걸로해서 가져오네요 ㅠㅠ
권한은 주었죠? External Storage에 대한..
https://stackoverflow.com/questions/34175313/how-to-upload-a-photo-using-retrofit2-to-server

이게 답인 듯 싶네요. Path를 가져오는 부분이 안드로이드 OS 버전별로 오류가 있는 것 같습니다. 제 앱도 상기로 바꾸어서 테스트해봐야 할 듯...
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
권한은 이렇게 주었습니다.
근데 서버를 통신할때 문제가 생기는데 패스 가져오는 부분이 문제일까요??ㅠㅠㅠ
권한은 맞게 주셨습니다.
디버깅의 출발은 오류니까, 다시 보면,
file:/storage/emulated/0/Download/1982298427_428b531b_B5ACEBAFB829.jpg (No such file or directory)
경로는 제대로 가져온 것 같은데요... 그러면 uri의 문제는 아니라고 보입니다.
path가 정상적으로 가져왔는데, 해당 파일이 없다고 나온 거죠.
Path가 나오는 탐색기에서 화면 캡쳐를 해서 보내 주실 수 있나요?
...