Java.io.FileNotFoundException 이 발생

안녕하세요…

REST api를 이용해서 글과 이미지를 올리는 작업을 하고 있습니다…

https://kapi.kakao.com/v1/api/story/upload/multi
이 url을 이용해서
result ====: ["/qoiJX/hylR8WrLuN/7gOYVnvk8S8WHKoLBqxl10/img.png?width=291&height=140"]
이미지 리절트값을 받아왔습니다…

이걸 다시 POST로 보내라고 하셔서…
content=%ED%95%99%EC%9B%90&image_url_list=%5B%22/qoiJX/hylR8WrLuN/7gOYVnvk8S8WHKoLBqxl10/img.png?width=291&height=140%22%5D
이렇게 params를 만들고…
아래 소스처럼 보냈습니다…

StringBuilder post_params=new StringBuilder("");
post_params.append(params);

String postResult="";
try {

    String url ="https://kapi.kakao.com/v1/api/story/post/photo";
    URL obj = new URL(url);
    HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

    con.setRequestMethod("POST");
    con.setRequestProperty("Authorization", "Bearer " + ACCESS_TOKEN);
    con.setDoOutput(true);
    OutputStreamWriter outputStreamWriter = new OutputStreamWriter(con.getOutputStream());
    outputStreamWriter.write(params.toString());
    outputStreamWriter.flush();

    int responseCode = con.getResponseCode();

    BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
    String inputLine;
    StringBuffer response = new StringBuffer();

    while ((inputLine = in.readLine()) != null) {
          response.append(inputLine + "\n");
    }
    in.close();

    postResult = response.toString();} 
catch (UnsupportedEncodingException e) {
    e.printStackTrace();
} catch (MalformedURLException e) {
    e.printStackTrace();
} catch (ProtocolException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}catch (Exception e) {
    e.printStackTrace();
}finally {
    postResult="";
}

이렇게 보냈더니
java.io.FileNotFoundException
에러가 뜨네요…

대체 어떻게 해야 하나요?
답변 부탁드립니다…

그럼 수고하십시요…

정확히 어떤 라인에서 익셉션이 발생하는 건가요? printStackTrace()로 프린트된 스택을 붙여주시면 좀 더 자세히 들여다 볼 수 있을 것 같은데요 :slight_smile:

2개의 좋아요

BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
여기서 IOException이 발생하네요…

printStackTrace()로 프린트된 스택 대신…스크린샷 이면 될듯해서 첨부합니다…

제발 자세한 답변부탁드립니다…ㅜㅜ
몇일째 이걸로 고생하고 있어요…ㅜㅜ…;;;;

FileNotFoudnException을 catch하는 부분에서 e.printStackTrace()한 결과값을 붙여주실 수 있나요? 정확한 익셉션 메시지를 봐야할 것 같아서 그렇습니다. 그리고 responseCode로 뭐가 리턴되는지도 알려주세요.

안드로이드 SDK도 해당 기능을 지원하는데요 레스트 API를 쓰시는 이유가 있나요?

2개의 좋아요

아~제가 안드로이드 개발은 초짜라서요;;;;

이곳저곳 정보를 찾아서…
sdk를 이용해서 로그인까지 완료는 했는데…
포스팅하는 부분에서 막혀서 진도가 안나갔습니다…;;

왜 그런지 모르겠지만…

private void requestPostPhoto(final String[] imageURLs,
final String storyContent) throws KakaoParameterException {
List fileList = new ArrayList();
final File uploadFile = new File(writeStoryImage(R.drawable.kakaostory_animated_gif));
fileList.add(uploadFile);

StoryPermission permission = StoryPermission.PUBLIC;
KakaoStoryService.requestPostPhoto(new KakaoStoryResponseCallback<MyStoryInfo>() {
    @Override
    public void onSuccess(MyStoryInfo result) {
        Logger.d(result.toString());
    }

    private void deleteUploadFiles() {
        if (uploadFile != null) {
            uploadFile.delete();
        }
    }
}, fileList, content, permission, true, execParam, execParam, marketParam, marketParam);

}

new KakaoStoryResponseCallback
여기가 빨간색으로 찾을 수 없다고 나오는데…콜백함수를 왜 찾을 수 없는지…이유를 모르겠더라고요…
로그인까지 된거보니까 SDK는 제대로 사용하고 있는거 같은데;;

그래서 여기 개발자포럼을 찾아보니 REST API로 진행한 사람이 있길래 그 분거 참고하면서
1차 이미지 업로드해서 response까지 받아오는걸 성공했기에
계속 REST API 쪽으로 시도를 하고 있습니다…

요청하신
e.printStackTrace()값은
java.io.FileNotFoundException: https://kapi.kakao.com/v1/api/story/post/photo
이런값이 나오고

responseCode값은
400
값이 들어가 있습니다…

안녕하세요.

위의 코드에서 KakaoStoryResponseCallback 같은 경우는 샘플앱에 정의되어 있는 StoryResponseCallback을 상속하는 abstract class 입니다. 샘플앱에서 KakaoStoryMainActivity.java를 보시면 맨 아래에 정의가 되어 있는 것을 볼 수 있습니다. 저 부분에 new StoryResponseCallback을 사용하시던지 아니면 샘플앱처럼 상속하는 클래스를 만들어서 사용하시면 되겠습니다. 지금 바로 돌아가는 코드로 만드려면 아래의 코드를 추가해 주시면 됩니다.

private abstract class KakaoStoryResponseCallback<T> extends StoryResponseCallback<T> {

    @Override
    public void onNotKakaoStoryUser() {
        KakaoToast.makeToast(self, "not KakaoStory user", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onFailure(ErrorResult errorResult) {
        final String message = "MyKakaoStoryHttpResponseHandler : failure : " + errorResult;
        Logger.w(message);
        KakaoToast.makeToast(self, message, Toast.LENGTH_LONG).show();
    }

    @Override
    public void onSessionClosed(ErrorResult errorResult) {
        redirectLoginActivity();
    }

    @Override
    public void onNotSignedUp() {
        redirectSignupActivity();
    }
}

그리고 REST API의 경우 로그를 찾아보니 image_url_list의 일부가 잘려 있어서 발생하는 문제였네요. & 문자를 URL 인코딩하지 않아서 생기는 문제인 것 같습니다. &를 %26로 인코딩하고 시도해보시면 어떨까요? 그리고 저 개인적으로는 잘 개발된 HTTP 라이브러리르 사용하시는 것을 권장드립니다. 서버 쪽에서는

{"code":-2,"msg":"failed to parse the parameter. name=image_url_list, stringToParse=[\"/b7qKr/hylR9akfkB/M8LnFKyn3uwEMt8EmoM47k/img.png?width=291, paramString=[\"/b7qKr/hylR9akfkB/M8LnFKyn3uwEMt8EmoM47k/img.png?width=291, paramStringAlias=null"}

라는 에러 메시지가 나갔거든요. Response body까지 볼 수 있다면 개발과 디버깅이 훨씬 용이할 것 같습니다.

3개의 좋아요

아 그리고 REST API를 사용하시는 중이라면 안드로이드 앱 개발 중이라고 하더라도 카테고리를 REST API로 지정해 주세요 :slight_smile: 더 전문가 분이 더 빨리 대답을 달아주실 거에요!

2개의 좋아요

아~~그렇군요…
친절한 답변 감사합니다…

덕분에 해결됐습니다…

아직 초짜라 잘 몰랐는데…
도와주신 덕분에 드디어 해결이 됐네요…

감사합니다…^^

그럼 번창하십시요~~~~~

해결되었으면 댓글에 라이크 좀 찍어주시면 감사하겠습니다 ㅋㅋㅋㅋㅋㅋ… (굽신)

2개의 좋아요

라이크가…하트모양이죠?
댓글마다 있는거?

1개의 좋아요

네 맞아요 ㅋㅋㅋㅋㅋㅋㅋ 히힛 감사합니다 :slight_smile:

1개의 좋아요