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

안드로이드 이미지 서버 저장 관련 에러 입니다.

0 추천

 

1.   Android Project Code 입니다. 

 

package com.example.cameraactivity2;

import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.provider.MediaStore.Images;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
	
	private final int  requestCode1= 101; // 앨범
	private final int requestCode2 = 102; // 사진기
	private ImageView imageView;
	private Bitmap profileBitmap;
	private TextView textView;
	
	final String boundary = "*************************************************";
	final String lindEnd = "\r\n";
	final String towHyphens = "--";
	
	Uri currImageURI;
	ProgressDialog dialog;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		imageView = (ImageView)findViewById(R.id.SecondImageView01);
		textView = (TextView)findViewById(R.id.textView1);
	}
	
	// 앨범
	public void albumBtn(View v){
		Intent intent = new Intent();
		intent.setAction(Intent.ACTION_GET_CONTENT);
		intent.setType("image/*");
		startActivityForResult(intent, requestCode1);
	}
	
	// 사진기
	public void cameraBtn(View v){
		Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE, null);
		startActivityForResult(intent, requestCode2);
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);

		//앨범		
		if(requestCode == requestCode1 && resultCode == RESULT_OK){
			if( data != null){

				try{
					
					
					currImageURI = data.getData();
					Bitmap photo = Images.Media.getBitmap(getContentResolver(), currImageURI);		
					profileBitmap = Bitmap.createScaledBitmap(photo, photo.getWidth(), photo.getHeight(), true);
	
					imageView.setBackgroundResource(0);
					imageView.setImageBitmap(profileBitmap);
					imageView.setScaleType(ImageView.ScaleType.FIT_XY);
	
			
					textView.setText("BALLERY: " + getgetRealPathFromURI(currImageURI));
				}catch(Exception e){
					
				}
			}
			
		}else if(requestCode == requestCode2 && resultCode == RESULT_OK){
			
		}else{
			Toast toast = Toast.makeText(this, "사진 선택이 취소 되었습니다. ", Toast.LENGTH_LONG);
			toast.show();
		}
		
	}
	
	//전송하기 버튼을 누르면
	public void saveBtn(View v) throws IOException{
		
		this.dialog = ProgressDialog.show(this, "전송 중..", "시간이 좀 걸려요:)", true, false);
		
		new Thread(new Runnable(){

			@Override
			public void run() {
				// 선택한 이미지의 uri를 읽어온다.
				Uri selPhtoUri = currImageURI;
				
				// 업로드할 서버의 url 주소
				String urlString = "http://192.168.0.11/mobile/saveImage.jsp";
				
				//절대경로를 획득한다!!! 중요~
				Cursor c = getContentResolver().query(Uri.parse(selPhtoUri.toString()), null, null, null, null);
				c.moveToNext();
				
				//업로드할 파일의 절대경로 얻어오기("_data") 로 해도 된다.
				String absolutePath = c.getString(c.getColumnIndex(MediaStore.MediaColumns.DATA));
				
				Toast.makeText(MainActivity.this, absolutePath, 0).show();
				
				//파일 업로드 시작!
				HttpFileUpload("http://192.168.0.11/mobile/saveImage.jsp", "", absolutePath	);
				confirmHandler.sendEmptyMessage(0);
				
						
			}
			
		}).start();
	}
	
	
	private Handler confirmHandler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			super.handleMessage(msg);
		}
	};
	
	
	private void HttpFileUpload(String urlString, String params, String fileName){
		try{
			FileInputStream mFileInputStream = new FileInputStream(fileName);
			
			URL connectUrl = new URL("urlString");
			
			Log.d("Test", "mFileInputStream is" + mFileInputStream);
			
			
			//open connection
			
			HttpURLConnection conn = (HttpURLConnection)connectUrl.openConnection();
			
			conn.setDoInput(true);
			conn.setDoOutput(true);
			conn.setUseCaches(false);
			conn.setRequestMethod("POST");
			conn.setRequestProperty("Connection", "Keep-Alive");
			conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
			
			//write data
			DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
			dos.writeBytes(towHyphens + boundary + lindEnd);
			dos.writeBytes("Content-Disposition: form-data; form-data; name=\"uploadedfile\";filename=\"" + fileName+"\""+lindEnd);
			dos.writeBytes(lindEnd);
			
			int bytesAvailable =mFileInputStream.available();
			int maxBufferSize = 1024;
			int bufferSize = Math.min(bytesAvailable, maxBufferSize);
			
			byte[] buffer = new byte[bufferSize];
			int bytesRead = mFileInputStream.read(buffer, 0, maxBufferSize);
			
			Log.d("Test", "image byte is " + bytesRead);
			
			//read image
			
			while(bytesRead >0){
				dos.write(buffer, 0, bufferSize);
				bytesAvailable = mFileInputStream.available();
				bufferSize = Math.min(bytesAvailable, maxBufferSize);
				bytesRead = mFileInputStream.read(buffer, 0, bufferSize);
			}
			
			dos.writeBytes(lindEnd);
			dos.writeBytes(towHyphens + boundary + towHyphens + lindEnd);
			
			
			//close streams
			Log.e("Test", "File is written");
			mFileInputStream.close();
			dos.flush();  //finish upload...
			
			//get response
			int ch;
			InputStream is = conn.getInputStream();
			StringBuffer b = new StringBuffer();
			while((ch = is.read() ) != -1){
				b.append((char)ch);
			}
			
			String s = b.toString();
			Log.e("Test", "result ="+s);
			dos.close();
			
			
		}catch(Exception e){
			Log.d("Test", "exception " + e.getMessage());
		}
	}
	
	public String getgetRealPathFromURI(Uri contentUri){
		String[] proj = {MediaStore.Images.Media.DATA};
		Cursor cursor = managedQuery(contentUri, proj, null, null, null);
		int coolumn_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
		cursor.moveToFirst();
		
		return cursor.getString(coolumn_index);
	}
	
	
	
}

 

서버 JSP 부분 입니다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
    


<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>

<%@page import="com.oreilly.servlet.MultipartRequest"%>

<%@ page pageEncoding="UTF-8"%>

<%

String dir = application.getRealPath("upload");

int max = 5*1024*1024;

MultipartRequest mr = new MultipartRequest(request, dir, max, "UTF-8", new DefaultFileRenamePolicy());

String orgFileName = mr.getOriginalFileName("file1");

String saveFileName = mr.getFilesystemName("file2");

%>

 

 

에러 입니다. 

 

 

머가 문제 인가요????

 

kdi0373 (470 포인트) 님이 2014년 6월 26일 질문

2개의 답변

0 추천
 
채택된 답변
background thread 에서 ui관련 함수를 호출해서 뻗는것입니다.

 

로그를 보시면 아시겠지만 Toast.makeText가 찍혀있는게 보이시죠?

background thread와 uithread는 분리 해주셔야 합니다.

필수에요! 필수!
갈무리 (12,430 포인트) 님이 2014년 6월 27일 답변
kdi0373님이 2014년 7월 2일 채택됨
제가 스레드 부분을 잘모라서 그러는데 참고 할 만한 자료 없나요?????
networkonmainthreadexception 검색 키워드 투척
+1 추천
네트워크 작업을 메인에서 작업하여 메인 쓰레드가 뻗은것이 아닌지요?

네트워크 업로드 부분을 쓰레드를 상속하여 별도의 쓰레드에서 작업하면 해결 될 것으로 보입니다.
인연 (31,880 포인트) 님이 2014년 6월 27일 답변
ServerConnection con = new ServerConnection();
               
//파일 업로드 시작!
con.HttpFileUpload("http://localhost/saveImage.jsp", "", absolutePath    );


이런식으로요????

일단 이렇게 해도 안되요
일단은 파일 업로드를 메소르로 만들었는데, 이 부분을 별도의 쓰레드로 분리하여 작업을 해야 합니다.
public class uploadthread extends thread{
 public void run(){
  네트워크 관련 작업
 }
}
위와 같이 하시고,  메인에서는 다음과 같이 사용하면 됩니다.
uploadthread thread = new uploadthread();
thread.start();
...