Следующий код загружает файл на сервер, отображает диалоги выполнения с процентами без каких-либо проблем.
protected boolean uploadFile(String serverUrl, String filePath) {
HttpURLConnection connection = null;
DataOutputStream outputStream = null;
DataInputStream inputStream = null;
int bytesRead, bytesAvailable, bufferSize;
byte[] buffer;
int serverResponseCode;
String serverResponseMessage;
boolean uploadstatus = false;
int count;
long lengthOfFile;
try {
urlServer = serverUrl;
pathFile = filePath;
FileInputStream fileInputStream;
fileInputStream = new FileInputStream(new File(pathFile));
URL url = new URL(urlServer);
connection = (HttpURLConnection) url.openConnection();
// Allow Inputs & Outputs
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setUseCaches(false);
// Enable POST method
connection.setRequestMethod("POST");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
outputStream = new DataOutputStream(connection.getOutputStream());
outputStream.writeBytes(twoHyphens + boundary + lineEnd);
outputStream.writeBytes(lineEnd);
lengthOfFile = new File(filePath).length();// length of file
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[1024];
bytesRead = 0;
String progressMsg = "";
while ((bytesRead = fileInputStream.read(buffer)) != -1) {
total += bytesRead;
progressMsg = new StringBuffer(" ").append((int) ((total * 100) / totalLengthOfFile)).toString();
prgressBarMsg[0] = progressMsg;
publishProgress(prgressBarMsg);
outputStream.write(buffer);// , 0, bufferSize);
}
outputStream.writeBytes(lineEnd);
outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
// Responses from the server (code and message)
serverResponseCode = connection.getResponseCode();
serverResponseMessage = connection.getResponseMessage();
if (serverResponseCode == 200)// HTTP OK Message from server
{
uploadstatus = true;
} else {
uploadstatus = false;
}
// this block will give the response of upload link
try {
BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = rd.readLine()) != null) {
// Log.i("ARC", "RES Message: " + line);
}
rd.close();
} catch (IOException ioex) {
// Log.e("ARC", "error: " + ioex.getMessage(), ioex);
}
fileInputStream.close();
outputStream.flush();
outputStream.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
connection.disconnect();
}
return uploadstatus;
}
Следующий код, использующий Apache, также загружает файл на сервер и рекомендуется для загрузки файлов с большими размерами (этоболее стабильный), но он немного медленнее с точки зрения времени загрузки по сравнению с приведенным выше кодом.Я обнаружил код, использующий исключение HttpURLConnection, когда размер файла превышает 20 МБ, поэтому я сейчас реализую код загрузки файла с использованием Apache.
protected boolean uploadFile(String serverUrl, String filePath) {
boolean status = false;
try {
File file = new File(filePath);
HttpClient httpClient = new DefaultHttpClient();
HttpPost postRequest = new HttpPost(serverUrl);
FileBody bin = new FileBody(file);
MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.STRICT);
reqEntity.addPart("myfile", bin);
postRequest.setEntity(reqEntity);
HttpResponse response = httpClient.execute(postRequest);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
String sResponse;
StringBuilder responseMsg = new StringBuilder();
while ((sResponse = reader.readLine()) != null) {
responseMsg = responseMsg.append(sResponse);
}
}
status = true;
} catch (ClientProtocolException e) {
} catch (IOException e) {
}
return status;
}
Я хочу отобразить диалог выполнения с процентами для загрузки файла с использованием кода Apache.Как мы можем получить значение bytesRead, используемое для вычисления процентного показателя хода выполнения для кода Apache?
Любые предложения / советы по реализации того же самого помогут вам.