안드로이드 개발 질문/답변
(글 수 45,052)
multipart 로 작업하려고 하는데
혹시 설명한 블로그나 예제소스 있나요
2012.04.19 11:38:48
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
public class HttpRequestor {
private URL targetURL;
public static final String CRLF = "\r\n";
private ArrayList list;
public HttpRequestor(URL target) {
this(target, 20);
}
public HttpRequestor(URL target, int initialCapicity) {
this.targetURL = target;
this.list = new ArrayList(initialCapicity);
}
public void addParameter(String parameterName, String parameterValue) {
if (parameterValue == null)
throw new IllegalArgumentException("parameterValue can't be null!");
list.add(parameterName);
list.add(parameterValue);
}
public void addFile(String parameterName, File parameterValue) {
if (parameterValue == null) {
list.add(parameterName);
list.add(new NullFile());
} else {
list.add(parameterName);
list.add(parameterValue);
}
}
public InputStream sendMultipartPost() throws IOException {
HttpURLConnection conn = (HttpURLConnection) targetURL.openConnection();
String delimeter = makeDelimeter();
byte[] newLineBytes = CRLF.getBytes();
byte[] delimeterBytes = delimeter.getBytes();
byte[] dispositionBytes = "Content-Disposition: form-data; name=".getBytes();
byte[] quotationBytes = "\"".getBytes();
byte[] contentTypeBytes = "Content-Type: application/octet-stream".getBytes();
byte[] fileNameBytes = "; filename=".getBytes();
byte[] twoDashBytes = "--".getBytes();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + delimeter);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
BufferedOutputStream out = null;
try {
out = new BufferedOutputStream(conn.getOutputStream());
Object[] obj = new Object[list.size()];
list.toArray(obj);
for (int i = 0; i < obj.length; i += 2) {
out.write(twoDashBytes);
out.write(delimeterBytes);
out.write(newLineBytes);
out.write(dispositionBytes);
out.write(quotationBytes);
out.write(((String) obj[i]).getBytes());
out.write(quotationBytes);
if (obj[i + 1] instanceof String) {
out.write(newLineBytes);
out.write(newLineBytes);
out.write(((String) obj[i + 1]).getBytes());
out.write(newLineBytes);
} else {
if (obj[i + 1] instanceof File) {
File file = (File) obj[i + 1];
out.write(fileNameBytes);
out.write(quotationBytes);
out.write(file.getAbsolutePath().getBytes());
out.write(quotationBytes);
} else {
out.write(fileNameBytes);
out.write(quotationBytes);
out.write(quotationBytes);
}
out.write(newLineBytes);
out.write(contentTypeBytes);
out.write(newLineBytes);
out.write(newLineBytes);
if (obj[i + 1] instanceof File) {
File file = (File) obj[i + 1];
BufferedInputStream is = null;
try {
is = new BufferedInputStream(new FileInputStream(file));
byte[] fileBuffer = new byte[1024 * 8]; // 8k
int len = -1;
while ((len = is.read(fileBuffer)) != -1) {
out.write(fileBuffer, 0, len);
}
} finally {
if (is != null)
try {
is.close();
} catch (IOException ex) {
}
}
}
out.write(newLineBytes);
}
if (i + 2 == obj.length) {
out.write(twoDashBytes);
out.write(delimeterBytes);
out.write(twoDashBytes);
out.write(newLineBytes);
}
} //
out.flush();
} finally {
if (out != null)
out.close();
}
return conn.getInputStream();
}
private static String makeDelimeter() {
return "---------------------------7d115d2a20060c";
}
private class NullFile {
NullFile() {
}
public String toString() {
return "";
}
}
}



