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

이미지파일 파일서버 업로드 에러

0 추천

일주일동안 전전긍긍했지만 ㅠ.ㅠ 해결 못했네요 도움좀 부탁하겠습니다. 

 

package com.example.testactivity;

import java.io.DataOutputStream;
import java.io.FileInputStream;
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 {

	final String boundary = "*****";
	final String lindEnd = "\r\n";
	final String towHyphens = "--";
	
	private final int  requestCode1= 101; // 앨범
	private final int requestCode2 = 102; // 사진기
	private ImageView imageView;
	private Bitmap profileBitmap;
	private TextView textView;
	
	
	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: " + getRealPathFromURI(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){
		
				// 선택한 이미지의 uri를 읽어온다.
				Uri selPhtoUri = currImageURI;
				
				// 업로드할 서버의 url 주소
				String urlString = "http://192.168.0.171/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(urlString, "", absolutePath);
				
				confirmHandler.sendEmptyMessage(0);
	}
	
	public  void HttpFileUpload(String urlString, String params, String fileName){
		
		try{
			
			FileInputStream mFileInputStream = new FileInputStream(fileName);
			
			URL connectUrl = new URL(urlString);
			
			System.out.println("mFileInputStream is " + mFileInputStream);
			
			//open connection
			System.out.println("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
			System.out.println("write data");
			DataOutputStream dos = new DataOutputStream(conn.getOutputStream());

			dos.writeBytes(towHyphens + boundary + lindEnd);
			dos.writeBytes("Content-Disposition: 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, bufferSize);
			
			System.out.println("image byte is "+ bytesRead);
			
			//read image
			System.out.println("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
			System.out.println("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();
			System.out.println("result ="+s);
			dos.close();
			
			
		}catch(Exception e){
			System.out.println(" exception =>  "+ e.getMessage());
		}	
	}
	
	
	private Handler confirmHandler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			super.handleMessage(msg);
		}
	};
	
	

	public String getRealPathFromURI(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);
	}
	
	
}

 

 

<%@ 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 import="com.tobesoft.platform.data.*" %>
<%@ page import="ubcrm.util.RequestUtil" %>

<%
	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년 7월 1일 질문

1개의 답변

+1 추천
 
채택된 답변
네트워크 작업은 메인 쓰레드에서 수행하면 안 됩니다. (API 버전을 낮추면 되긴 합니다..) 로그에 어떤 것이 출력되는지는 모르겠지만 그 점부터 수정하고 다시 시도해보시는게 좋을 것 같네요.
인연 (31,880 포인트) 님이 2014년 7월 1일 답변
kdi0373님이 2014년 7월 2일 채택됨
...