C
cmk128
Hi
I am using the following function to post a file to the web server.
But i found out the DataOutputStream::flush() cannot flush the data,
it seem to cache the whole query before send it out. Some people have
discovered this problem before : http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5026745
But how to fix it? I need to add a progress bar to my app, so i need
to know how many byte have been send out.
thanks
from Peter ([email protected])
private boolean uploadFile(File file, String relativePath, int
rowNumber) {
try {
URL u = new URL("http://microsoft.com/test.php");
URLConnection c = u.openConnection();
// post multipart data
c.setDoOutput(true);
c.setDoInput(true);
c.setUseCaches(false);
// set some request headers
c.setRequestProperty("Connection", "Keep-Alive");
c.setRequestProperty("Cache-Control", "no-cache");
c.setRequestProperty("HTTP_REFERER",
"http://pvs.kingofcoder.com/
test.php");
c.setRequestProperty("Content-Type",
"multipart/form-data; charset=utf-8;
boundary=****4353");
DataOutputStream dstream = new
DataOutputStream(c.getOutputStream());
// write currentpath
dstream.writeBytes("--****4353\r\n");
dstream.writeBytes(
"Content-Disposition: form-data; name=\"currentPath
\"\r\n\r\n");
//
dstream.writeBytes(URLEncoder.encode(this.getParameter("currentpath"),
"UTF-8"));
String currentPath = (getParameter("currentPath") ==
null) ? "" :
getParameter("currentPath");
dstream.writeBytes(currentPath);
dstream.writeBytes("\r\n");
// write relativePath
dstream.writeBytes("--****4353\r\n");
dstream.writeBytes(
"Content-Disposition: form-data; name=
\"relativePath\"\r\n\r\n");
dstream.writeBytes(relativePath);
dstream.writeBytes("\r\n");
// write filename
dstream.writeBytes("--****4353\r\n");
dstream.writeBytes(
"Content-Disposition: form-data; name=
\"uploadedFile\"; filename=\"" +
file.getName() +
"\"\r\nContent-Type: application/octet-stream\r\n\r
\n");
//write file content
FileInputStream fi = new FileInputStream(file);
byte[] bt = new byte[102400];
int cnt = fi.read(bt);
int numOfByteSent = cnt;
while (cnt == bt.length) {
dstream.write(bt, 0, cnt);
dstream.flush();
cnt = fi.read(bt);
numOfByteSent += cnt;
pMainTableModel.getStatus().set(rowNumber,
String.valueOf(numOfByteSent /
file.length()));
System.out.println(">" + numOfByteSent);
pMainTableModel.fireTableDataChanged();
}
dstream.write(bt, 0, cnt);
dstream.flush();
pMainTableModel.getStatus().set(rowNumber, "100");
dstream.writeBytes("\r\n--****4353--\r\n\r\n");
dstream.flush();
dstream.close();
fi.close();
// end write file content
try {
DataInputStream in =
new DataInputStream(c.getInputStream());
String sIn;
while ((sIn = in.readLine()) != null) {
if (sIn != null) {
System.out.println(sIn);
}
if (sIn.equals("upload success")) {
return true;
}
}
return false;
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
} catch (Exception ex2) {
ex2.printStackTrace();
return false;
}
}
I am using the following function to post a file to the web server.
But i found out the DataOutputStream::flush() cannot flush the data,
it seem to cache the whole query before send it out. Some people have
discovered this problem before : http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5026745
But how to fix it? I need to add a progress bar to my app, so i need
to know how many byte have been send out.
thanks
from Peter ([email protected])
private boolean uploadFile(File file, String relativePath, int
rowNumber) {
try {
URL u = new URL("http://microsoft.com/test.php");
URLConnection c = u.openConnection();
// post multipart data
c.setDoOutput(true);
c.setDoInput(true);
c.setUseCaches(false);
// set some request headers
c.setRequestProperty("Connection", "Keep-Alive");
c.setRequestProperty("Cache-Control", "no-cache");
c.setRequestProperty("HTTP_REFERER",
"http://pvs.kingofcoder.com/
test.php");
c.setRequestProperty("Content-Type",
"multipart/form-data; charset=utf-8;
boundary=****4353");
DataOutputStream dstream = new
DataOutputStream(c.getOutputStream());
// write currentpath
dstream.writeBytes("--****4353\r\n");
dstream.writeBytes(
"Content-Disposition: form-data; name=\"currentPath
\"\r\n\r\n");
//
dstream.writeBytes(URLEncoder.encode(this.getParameter("currentpath"),
"UTF-8"));
String currentPath = (getParameter("currentPath") ==
null) ? "" :
getParameter("currentPath");
dstream.writeBytes(currentPath);
dstream.writeBytes("\r\n");
// write relativePath
dstream.writeBytes("--****4353\r\n");
dstream.writeBytes(
"Content-Disposition: form-data; name=
\"relativePath\"\r\n\r\n");
dstream.writeBytes(relativePath);
dstream.writeBytes("\r\n");
// write filename
dstream.writeBytes("--****4353\r\n");
dstream.writeBytes(
"Content-Disposition: form-data; name=
\"uploadedFile\"; filename=\"" +
file.getName() +
"\"\r\nContent-Type: application/octet-stream\r\n\r
\n");
//write file content
FileInputStream fi = new FileInputStream(file);
byte[] bt = new byte[102400];
int cnt = fi.read(bt);
int numOfByteSent = cnt;
while (cnt == bt.length) {
dstream.write(bt, 0, cnt);
dstream.flush();
cnt = fi.read(bt);
numOfByteSent += cnt;
pMainTableModel.getStatus().set(rowNumber,
String.valueOf(numOfByteSent /
file.length()));
System.out.println(">" + numOfByteSent);
pMainTableModel.fireTableDataChanged();
}
dstream.write(bt, 0, cnt);
dstream.flush();
pMainTableModel.getStatus().set(rowNumber, "100");
dstream.writeBytes("\r\n--****4353--\r\n\r\n");
dstream.flush();
dstream.close();
fi.close();
// end write file content
try {
DataInputStream in =
new DataInputStream(c.getInputStream());
String sIn;
while ((sIn = in.readLine()) != null) {
if (sIn != null) {
System.out.println(sIn);
}
if (sIn.equals("upload success")) {
return true;
}
}
return false;
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
} catch (Exception ex2) {
ex2.printStackTrace();
return false;
}
}