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

multipart 다중 파일전송 질문

0 추천

초보 안드로이드 개발자 입니다.

단말에 있는 이미지 파일과 문자열을 서버(php)로 전송하는 부분을 구현하였습니다.

문제없이 전송이 잘 되는데요..

이미지 파일을 여러개 전송할때는 어떻게 구현해야하는지 몰라서 질문 드립니다.

단순히 writeBytes 부분에 이미지 파일 경로를 하나 더 잡아주면 되는건지..

조언을 부탁 드립니다.

감사합니다.

public int uploadFile(final String sourceFileUri, final String mode, final String savename, final String width, final String height, final ILoveResponseHandler responsehandler) 
{
	synchronized(queue) {
		final Runnable r = new Runnable() {
			
			public void run() {
				String upLoadServerUri = "전송할서버url";
				String fileName = sourceFileUri;
				int serverResponseCode = 0;
		
				HttpURLConnection conn = null;
				DataOutputStream dos = null;
				String lineEnd = "\r\n";
				String twoHyphens = "--";
				String boundary = "*****";
				int bytesRead, bytesAvailable, bufferSize;
				byte[] buffer;
				int maxBufferSize = 1 * 1024 * 1024; 
				File sourceFile = new File(sourceFileUri); 
				
				if (!sourceFile.isFile()) {
				
					Log.e("uploadFile", "Source File not exist :"+sourceFileUri);
				}
				else
				{
					try { 
						
						// open a URL connection to the Servlet
						FileInputStream fileInputStream = new FileInputStream(sourceFile);
						URL url = new URL(upLoadServerUri);
				
						// Open a HTTP  connection to  the URL
						conn = (HttpURLConnection) url.openConnection(); 
						conn.setDoInput(true); // Allow Inputs
						conn.setDoOutput(true); // Allow Outputs
						conn.setUseCaches(false); // Don't use a Cached Copy
						conn.setRequestMethod("POST");
						conn.setRequestProperty("Connection", "Keep-Alive");
						conn.setRequestProperty("ENCTYPE", "multipart/form-data");
						conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
						conn.setRequestProperty("attachfile", fileName);
						conn.setRequestProperty("mode", mode);
				
						dos = new DataOutputStream(conn.getOutputStream());
						
						dos.writeBytes(twoHyphens + boundary + lineEnd);
						dos.writeBytes("Content-Disposition: form-data; name=\"mode\"" + lineEnd);
						dos.writeBytes(lineEnd);
						dos.writeBytes(mode);
						dos.writeBytes(lineEnd);
						
						dos.writeBytes(twoHyphens + boundary + lineEnd);
						dos.writeBytes("Content-Disposition: form-data; name=\"savename\"" + lineEnd);
						dos.writeBytes(lineEnd);
						dos.writeBytes(savename);
						dos.writeBytes(lineEnd);
						
						dos.writeBytes(twoHyphens + boundary + lineEnd);
						dos.writeBytes("Content-Disposition: form-data; name=\"width\"" + lineEnd);
						dos.writeBytes(lineEnd);
						dos.writeBytes(width);
						dos.writeBytes(lineEnd);
						
						dos.writeBytes(twoHyphens + boundary + lineEnd);
						dos.writeBytes("Content-Disposition: form-data; name=\"height\"" + lineEnd);
						dos.writeBytes(lineEnd);
						dos.writeBytes(height);
						dos.writeBytes(lineEnd);
				
						// 이미지 파일
						dos.writeBytes(twoHyphens + boundary + lineEnd); 
						dos.writeBytes("Content-Disposition: form-data; name=\"attachfile\";filename=\"" + fileName + "\"" + lineEnd);
						dos.writeBytes(lineEnd);
				
						// create a buffer of  maximum size
						bytesAvailable = fileInputStream.available(); 
				
						bufferSize = Math.min(bytesAvailable, maxBufferSize);
						buffer = new byte[bufferSize];
				
						// read file and write it into form...
						bytesRead = fileInputStream.read(buffer, 0, bufferSize); 
		
						while (bytesRead > 0) {
				
							dos.write(buffer, 0, bufferSize);
							bytesAvailable = fileInputStream.available();
							bufferSize = Math.min(bytesAvailable, maxBufferSize);
							bytesRead = fileInputStream.read(buffer, 0, bufferSize);
		
						}
				
						// send multipart form data necesssary after file data...
						dos.writeBytes(lineEnd);
						dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
				
						// Responses from the server (code and message)
						serverResponseCode = conn.getResponseCode();
						String serverResponseMessage = conn.getResponseMessage();
				
						if(serverResponseCode == 200){
							Log.i("uploadFile", "File Upload Complete.");
						}
						
						// get response
						BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
						String str;

						StringBuffer b = new StringBuffer();
						while ((str = br.readLine()) != null) {
							b.append(str);
						}
						String response = b.toString();
						
						int statusCode = -1;
						JSONObject responseData = null;
						
						
						try {
							responseData = new JSONObject(response);
							statusCode = responseData.getInt("result");
							if(responsehandler != null)
								responsehandler.sendSuccessMessage(statusCode,responseData);
						} catch (JSONException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
							statusCode = -999;
							responseData = new JSONObject();
							try {
								responseData.put("result", "-999");
								responseData.put("error","sendSuccess_error");
							} catch (JSONException e1) {
								// TODO Auto-generated catch block
								e1.printStackTrace();
							}    				
							if(responsehandler != null)
								responsehandler.SendErrorMessage(statusCode, responseData);
						}

						//close the streams //
						fileInputStream.close();
						dos.flush();
						dos.close();
				
					} catch (MalformedURLException ex) {
		
						ex.printStackTrace();
						
						Log.e("Upload file to server", "error: " + ex.getMessage(), ex);
					} catch (Exception e) {
				
						e.printStackTrace();
						
						Log.e("Upload file to server Exception", "Exception : " + e.getMessage(), e);
					}
					//return serverResponseCode;
				} // End else block 
			}
		};
		queue.addLast(r);
		queue.notify();
	}
	return 1;
}

 

orangestorm (150 포인트) 님이 2014년 2월 25일 질문

1개의 답변

0 추천
 
채택된 답변
업로드 쓰레드를 loop를 돌리면 안되는 이유라도 있나요?

업로드 완료부분에 핸들러를 넣어서 종료될떄 다음 파일 URL로 쓰레드를 반복으로 돌리시면 될듯 한데요.
아픔제로 (3,460 포인트) 님이 2014년 2월 25일 답변
orangestorm님이 2014년 2월 25일 채택됨
그렇게 처리하는 방법이 최선이군요 ^^;
제가 java가 처음이라.. 쓰레드 처리가 아닌 한번에 다수의 파일을 전송할 수 있는 방법이 있는지 싶어서 질문 드렸습니다. 답변 감사합니다.
...