안녕하세요. 완전 초짜 인사드립니다. ㅡ.ㅜ
지금 웹뷰 제작 중인데요... 솔직히 html도 잘 모르고 자바도 잘 모릅니다. 어찌어찌 하다보니 만들고 있긴한데,,
일정 주소를 가졌을때 어플페이지가뜨고 글을 작성해서 게시판에 글과 이미지가 전송되게 해야 합니다.
(예를 들어 네이버 앱에서 지식인과 비슷한,,,)
php 프로그래머 분께서 multipart/fotm-data을 사용하라고 해서 이리저리 찾아봤는데요,,
우선 소스는 맞는거 같긴 한데,,
public InputStream sendMultipartPost() throws IOException { HttpURLConnection conn = (HttpURLConnection)targetURL.openConnection(); // Delimeter 생성 String seq = "aaa"; String delimeter = makeDelimeter(); byte[] newLineBytes = CRLF.getBytes(); byte[] delimeterBytes = delimeter.getBytes(); byte[] dispositionBytes ="Content-Disposition: form-data; name=type".getBytes(); byte[] prattleQuestionBytes = "prattleQuestion".getBytes(); byte[] quotationBytes = "\"".getBytes(); byte[] contentTypeBytes = "Content-Type: application/octet-stream".getBytes(); byte[] fileNameBytes = "; filename=".getBytes(); byte[] twoDashBytes = "--".getBytes(); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "multipart/form-data; boundary="+delimeter); conn.setDoInput(true); conn.setDoOutput(true); conn.setUseCaches(false); BufferedOutputStream out = null; try { out = new BufferedOutputStream(conn.getOutputStream()); Object[] obj = new Object[list.size()]; Log.i("tag", "listSize : " + list.size()); list.toArray(obj); for (int i = 0 ; i < obj.length ; i += 2) { // Delimeter 전송 out.write(twoDashBytes); out.write(delimeterBytes); out.write(newLineBytes); // 파라미터 이름 출력 out.write(dispositionBytes); out.write(prattleQuestionBytes); out.write(quotationBytes); out.write( ((String)obj[i]).getBytes() ); out.write(quotationBytes); if ( obj[i+1] instanceof String) { // String 이라면 out.write(newLineBytes); out.write(newLineBytes); // 값 출력 out.write( ((String)obj[i+1]).getBytes() ); out.write(newLineBytes); } else { // 파라미터의 값이 File 이나 NullFile인 경우 if ( obj[i+1] instanceof File) { File file = (File)obj[i+1]; // File이 존재하는 지 검사한다. out.write(fileNameBytes); out.write(quotationBytes); out.write(file.getAbsolutePath().getBytes() ); out.write(quotationBytes); } else { // NullFile 인 경우 out.write(fileNameBytes); out.write(quotationBytes); out.write(quotationBytes); } out.write(newLineBytes); out.write(contentTypeBytes); out.write(newLineBytes); out.write(newLineBytes); // File 데이터를 전송한다. if (obj[i+1] instanceof File) { File file = (File)obj[i+1]; Log.d("tag", file.getPath()); // file에 있는 내용을 전송한다. BufferedInputStream is = null; try { is = new BufferedInputStream(new FileInputStream(file)); byte[] fileBuffer = new byte[1024 * 8]; // 8k int len = -1; while ( (len = is.read(fileBuffer)) != -1) { out.write(fileBuffer, 0, len); } } finally { if (is != null) try { is.close(); } catch(IOException ex) {} } } out.write(newLineBytes); } // 파일 데이터의 전송 블럭 끝 if ( i + 2 == obj.length ) { // 마지막 Delimeter 전송 out.write(twoDashBytes); out.write(delimeterBytes); out.write(twoDashBytes); out.write(newLineBytes); } } // for 루프의 끝 out.flush(); } finally { if (out != null) out.close(); } return conn.getInputStream(); }
전송 관련된 메서드 인데요,, 당연히 제가 짠건 아니고 소스 복사한거인데요,,
php프로그래머 분께서
type => prattle_Question
보내는 파일 인자의 이름 => imgfile
contents => 글내용
user_id => 아이디값
이렇게 해달라고 하시더군요,, html도 모르고 자바도 잘 모르다보니,, 어떻게 적용을 시켜야 할지도 의문이네요,,
그리고 또,,, 우선 위에꺼 제껴 두고라도 테스트를 해보기 위해서
실행을 시켜봤는데요,,
빨간색으로 되어있는 is = new BufferedInputStream(new FileInputStream(file));
이부분에서 에러가 나네요,,
에러내용은 다음과 같습니다.
08-21 12:21:37.555: WARN/System.err(3283): java.io.FileNotFoundException: /external/images/media/756 (No such file or directory)
08-21 12:21:37.557: WARN/System.err(3283): at org.apache.harmony.luni.platform.OSFileSystem.openImpl(Native Method)
08-21 12:21:37.557: WARN/System.err(3283): at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:152)
08-21 12:21:37.557: WARN/System.err(3283): at java.io.FileInputStream.<init>(FileInputStream.java:82)
08-21 12:21:37.557: WARN/System.err(3283): at com.webview.HttpRequestor.sendMultipartPost(HttpRequestor.java:234)
08-21 12:21:37.558: WARN/System.err(3283): at com.webview.BeaugleSudaQuestion$3.onClick(BeaugleSudaQuestion.java:100)
08-21 12:21:37.558: WARN/System.err(3283): at android.view.View.performClick(View.java:2437)
08-21 12:21:37.559: WARN/System.err(3283): at android.view.View$PerformClick.run(View.java:8852)
08-21 12:21:37.562: WARN/System.err(3283): at android.os.Handler.handleCallback(Handler.java:587)
08-21 12:21:37.563: WARN/System.err(3283): at android.os.Handler.dispatchMessage(Handler.java:92)
08-21 12:21:37.563: WARN/System.err(3283): at android.os.Looper.loop(Looper.java:123)
08-21 12:21:37.564: WARN/System.err(3283): at android.app.ActivityThread.main(ActivityThread.java:4627)
08-21 12:21:37.564: WARN/System.err(3283): at java.lang.reflect.Method.invokeNative(Native Method)
08-21 12:21:37.565: WARN/System.err(3283): at java.lang.reflect.Method.invoke(Method.java:521)
08-21 12:21:37.567: WARN/System.err(3283): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:869)
08-21 12:21:37.568: WARN/System.err(3283): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:627)
08-21 12:21:37.569: WARN/System.err(3283): at dalvik.system.NativeStart.main(Native Method)
이 부분이 최종적으로 문제가 된다는걸 알았는데요..
정확하게 new FileInputStream(file) 이부분에서 문제가 생기는거 같습니다.
맨 윗줄에서 보듯이 파일을 찾을 수가 없다고 나오는데요... path가 찍히는데,, 파일을 찾을수 없는건 왜일까요,,
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != RESULT_OK) { return; }
switch (requestCode) { case CROP_FROM_CAMERA: { // 크롭이 된 이후의 이미지를 넘겨 받습니다. // 이미지뷰에 이미지를 보여준다거나 부가적인 작업 이후에 // 임시 파일을 삭제합니다. final Bundle extras = data.getExtras(); if (extras != null) { Bitmap photo = extras.getParcelable("data"); //mPhotoImageView.setImageBitmap(photo); imageView.setImageBitmap( photo ); imageContainer.setVisibility( View.VISIBLE ); }
// 임시 파일 삭제 //File f = new File(mImageCaptureUri.getPath()); //if (f.exists()) { //f.delete(); //}
break; }
case PICK_FROM_ALBUM: { // 이후의 처리가 카메라와 같으므로 일단 break없이 진행합니다. // 실제 코드에서는 좀더 합리적인 방법을 선택하시기 바랍니다.
mImageCaptureUri = data.getData(); }
case PICK_FROM_CAMERA: { // 이미지를 가져온 이후의 리사이즈할 이미지 크기를 결정합니다. // 이후에 이미지 크롭 어플리케이션을 호출하게 됩니다. mImageCaptureUri = data.getData(); Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(mImageCaptureUri, "image/*");
/* intent.putExtra("outputX", 90); intent.putExtra("outputY", 90); intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); */
intent.putExtra("scale", true); intent.putExtra("return-data", true); startActivityForResult(intent, CROP_FROM_CAMERA); break; } } }
버튼을 누르면 앨범이나 사진을 찍어서 화면에 보여주는 소스인데요,,, 이것도 잘 모르는 상태에서 이리저리 실험해보다보니,,
주석도 많고 하네요,, 아무튼 내용은 사진을 찍든 앨범을 선택을 하든 크롭을 한후에 이미지뷰에 보여준 상태인데요,,
주석처리 되어있다시피,, 임시저장된 파일을 삭제한 상태가 아닙니다,,
path가 안찍히는것도 아닌데,, 파일을 찾을수가 없는걸까요? ㅡ.ㅜ
그리고,, 전 크롭하기는 싫은데,, 소스를 찾을 수가 없어서,,,;;; 크롭을 사용하는 소스를 썻는데요,, 크롭안하고,,
그냥 이미지뷰에 보여주는 방법은 뭐가 있을까요,, -0-;;;; 도움 부탁드립니다!!!
아,, 긴글 읽어주셔서 대단히 감사합니다 ^^