안드로이드 개발 질문/답변
(글 수 45,052)
http://www.androidpub.com/451838
자료를 보고 제가 만든 어플에서
기본 갤러리 어플을 인텐트로 불러서
이미지 Uri를 알아내고
http://www.mail-archive.com/android-developers@googlegroups.com/msg66448.html
여기에서 Uri로부터 파일의 절대경로를 구하는 방법을 알아내고
http://blog.inculab.net/28
여기 글 밑에 소스코드 다운로드 받아서 웹서버에 upload.php 로 이미지를 전송하는데 까지는 성공했어요.
근데 이미지를 아이디(문자열) 이름으로 서버에저장을 해야하기에
이미지와 (아이디(mb_id))문자열 변수를 upload.php 파일로 동시에 전송하는 방법을 알고 싶습니다.
업로드에 사용된 소스코드는 다음과 같습니다..
부탁드립니다.. (--)(__) 꾸벅..
공지사항 읽었습니다..
자료를 보고 제가 만든 어플에서
기본 갤러리 어플을 인텐트로 불러서
이미지 Uri를 알아내고
http://www.mail-archive.com/android-developers@googlegroups.com/msg66448.html
여기에서 Uri로부터 파일의 절대경로를 구하는 방법을 알아내고
http://blog.inculab.net/28
여기 글 밑에 소스코드 다운로드 받아서 웹서버에 upload.php 로 이미지를 전송하는데 까지는 성공했어요.
근데 이미지를 아이디(문자열) 이름으로 서버에저장을 해야하기에
이미지와 (아이디(mb_id))문자열 변수를 upload.php 파일로 동시에 전송하는 방법을 알고 싶습니다.
업로드에 사용된 소스코드는 다음과 같습니다..
부탁드립니다.. (--)(__) 꾸벅..
[이미지 업로드 소스]
public class UploadTest extends Activity { private Button mUploadBtn; private FileInputStream mFileInputStream = null; private URL connectUrl = null; private EditText mEdityEntry; String lineEnd = "\r\n"; String twoHyphens = "--"; String boundary = "*****"; Intent intent; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.upload_test); mEdityEntry = (EditText)findViewById(R.id.edit_entry); intent = getIntent(); mEdityEntry.setText(intent.getStringExtra("data_selPhotoUriPath")); mUploadBtn = (Button)findViewById(R.id.btn); mUploadBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub try { mEdityEntry.setText("Uploading..."); String mFilePath = intent.getStringExtra("data_selPhotoUriPath"); //String mFilePath = "/sdcard/DCIM/Camera/photo001.jpg"; DoFileUpload(mFilePath); } catch (Exception e) { // TODO: handle exception } } }); } private void DoFileUpload(String filePath) throws IOException { Log.d("Test" , "file path = " + filePath); HttpFileUpload("http://jumoni.com/upload.php", "", filePath); } private void HttpFileUpload(String urlString, String params, String fileName) { try { mFileInputStream = new FileInputStream(fileName); 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(twoHyphens + boundary + lineEnd); dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + fileName+"\"" + lineEnd); dos.writeBytes(lineEnd); 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); 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(lineEnd); dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); // 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); mEdityEntry.setText(s); dos.close(); } catch (Exception e) { Log.d("Test", "exception " + e.getMessage()); // TODO: handle exception } } }
공지사항 읽었습니다..
2010.11.09 12:43:10
//param roof
for(int i =0; i<paramNames.size();i++){
dos.writeBytes(twoHyphens + boundary + lineEnd); //필드 구분자 시작
dos.writeBytes("Content-Disposition: form-data; name=\""+paramNames.get(i)+"\""+ lineEnd);
dos.writeBytes(lineEnd);
dos.writeBytes(paramValues.get(i));
dos.writeBytes(lineEnd);
}
//file roof
for(int i =0; i<files.size();i++){
//======================start
// fis = new FileInputStream(files.get(files.size()-1));
fis = new FileInputStream(files.get(i));
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + files.get(i).getName() +"\""+ lineEnd);
dos.writeBytes(lineEnd);
bytesAvailable = fis.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// read file and write it into form...
bytesRead = fis.read(buffer, 0, bufferSize);
while (bytesRead > 0)
{
dos.write(buffer, 0, bufferSize);
bytesAvailable = fis.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fis.read(buffer, 0, bufferSize);
}
// send multipart form data necesssary after file data...
dos.writeBytes(lineEnd);
//======================end
}
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
//저두그것때문에 고민좀했는데~~
//요런식으로 하세요 ^^
//조심할껀 필드구분자와 lineEnd가 틀리면 안돼요~
for(int i =0; i<paramNames.size();i++){
dos.writeBytes(twoHyphens + boundary + lineEnd); //필드 구분자 시작
dos.writeBytes("Content-Disposition: form-data; name=\""+paramNames.get(i)+"\""+ lineEnd);
dos.writeBytes(lineEnd);
dos.writeBytes(paramValues.get(i));
dos.writeBytes(lineEnd);
}
//file roof
for(int i =0; i<files.size();i++){
//======================start
// fis = new FileInputStream(files.get(files.size()-1));
fis = new FileInputStream(files.get(i));
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + files.get(i).getName() +"\""+ lineEnd);
dos.writeBytes(lineEnd);
bytesAvailable = fis.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// read file and write it into form...
bytesRead = fis.read(buffer, 0, bufferSize);
while (bytesRead > 0)
{
dos.write(buffer, 0, bufferSize);
bytesAvailable = fis.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fis.read(buffer, 0, bufferSize);
}
// send multipart form data necesssary after file data...
dos.writeBytes(lineEnd);
//======================end
}
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
//저두그것때문에 고민좀했는데~~
//요런식으로 하세요 ^^
//조심할껀 필드구분자와 lineEnd가 틀리면 안돼요~
파일 파트의 바운드리 표시를
Content-Disposition: form-data; name="필드명";filename="파일명"
으로 했다면 일반 파라메터는
으로 만 바운드리 표시를 하시면 됩니다.Content-Disposition: form-data; name="필드명"
바운드리 바디는 URL 인코딩된 파라메터 값을 출력하시면 됩니다.
이건 POST 방식으로 데이터 보낼때고요.
짧은 크기의 파라메터라면 좀더 손쉽게 그냥 get 방식으로 전송 URL뒤에 쿼리 스트링 붙이세요
http://서버/파일전송주소.php?name=value
의 방법으로 말이죠.
물론 name과 value는 URL인코딩 하셔야 합니다.