안드로이드 개발 질문/답변
(글 수 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인코딩 하셔야 합니다.