i want to upload a file to a php server. i could upload file with below method :
curl -i -X POST -F file=@1.jpg http://something/sth
and after that i can download using browser.
but when uploading file using below java code i could not download using browser.
URL url = new URL(mUrl);
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
String Tag = "fSnd";
Log.e(Tag, "Starting Http File Sending to URL");
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
bytes);
// Open a HTTP connection to the URL
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// Allow Inputs
conn.setDoInput(true);
// Allow Outputs
conn.setDoOutput(true);
// Don't use a cached copy.
conn.setUseCaches(false);
// Use a post method.
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type",
"multipart/form-data;boundary=" + boundary);
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"title\""
+ lineEnd);
dos.writeBytes(lineEnd);
dos.writeBytes("File1");
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"description\""
+ lineEnd);
dos.writeBytes(lineEnd);
dos.writeBytes("File2");
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\""
+ "File3.jpg" + "\"" + lineEnd);
dos.writeBytes(lineEnd);
Log.e(Tag, "Headers are written");
byte data[] = new byte[1024 * 2];
int count = 0;
while ((count = byteArrayInputStream.read(data)) != -1) {
mSoFarLength += count;
Log.d("FFF", "count : " + count + " mSoFarLength : "
+ mSoFarLength + " mTotalLength : " + mTotalLength);
dos.write(data, 0, count);
mProgress = ((mSoFarLength * 100) / mTotalLength);
for (LocalTransmitterListener baseTransmitterListener : baseTransmitterListeners) {
baseTransmitterListener.onUpdateProgress(mProgress);
}
}
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
// close streams
byteArrayInputStream.close();
dos.flush();
Log.e(Tag,
"File Sent, Response: "
+ String.valueOf(conn.getResponseCode()));
InputStream is = conn.getInputStream();
// retrieve the response from server
int ch;
StringBuffer b = new StringBuffer();
while ((ch = is.read()) != -1) {
b.append((char) ch);
}
String s = b.toString();
Log.i("Response", s);
dos.close();
at least i found solution.i should pay attention to entity name.and it should be same as the server.
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(mUrl);
File file = new File(mFileAdrress);
FileInputStream fileInputStream = new FileInputStream(file);
httpClient.getParams().setParameter(CoreProtocolPNames.USER_AGENT,
System.getProperty("http.agent"));
InputStreamBody inputStreamBody = new InputStreamBody(
fileInputStream, file.getName());
MultipartEntityBuilder multipartEntity = MultipartEntityBuilder
.create();
multipartEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
multipartEntity.addPart("file", inputStreamBody); // file should be same as server
final HttpEntity myEntity = multipartEntity.build();
class ProgressiveEntity implements HttpEntity {
@Override
public void consumeContent() throws IOException {
myEntity.consumeContent();
}
@Override
public InputStream getContent() throws IOException,
IllegalStateException {
return myEntity.getContent();
}
@Override
public Header getContentEncoding() {
return myEntity.getContentEncoding();
}
@Override
public long getContentLength() {
return myEntity.getContentLength();
}
@Override
public Header getContentType() {
return myEntity.getContentType();
}
@Override
public boolean isChunked() {
return myEntity.isChunked();
}
@Override
public boolean isRepeatable() {
return myEntity.isRepeatable();
}
@Override
public boolean isStreaming() {
return myEntity.isStreaming();
}
@Override
public void writeTo(OutputStream outstream) throws IOException {
class ProxyOutputStream extends FilterOutputStream {
public ProxyOutputStream(OutputStream proxy) {
super(proxy);
}
public void write(int idx) throws IOException {
out.write(idx);
}
public void write(byte[] bts) throws IOException {
out.write(bts);
}
public void write(byte[] bts, int st, int end)
throws IOException {
out.write(bts, st, end);
}
public void flush() throws IOException {
out.flush();
}
public void close() throws IOException {
out.close();
}
}
class ProgressiveOutputStream extends ProxyOutputStream {
public ProgressiveOutputStream(OutputStream proxy) {
super(proxy);
}
public void write(byte[] bts, int st, int end)
throws IOException {
writed += end;
out.write(bts, st, end);
mProgress = (int) ((mSoFarLength * 100) / (mTotalLength));
}
}
myEntity.writeTo(new ProgressiveOutputStream(outstream));
}
}
ProgressiveEntity progressiveEntity = new ProgressiveEntity();
httpPost.setEntity(progressiveEntity);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
String state = EntityUtils.toString(httpEntity);