Я пытаюсь загрузить некоторые данные на сервер Heroku/PHP, и по какой-то причине он работает непоследовательно. Он отлично работает для меня в нашем офисе, но когда другие пытаются использовать наше приложение, ни один файл не доходит до сервера. Сервер дает ошибку «пустой файл».Загрузка Android-файлов несовместимо
Вот код загрузки из Android:
private class SubmitClientTask extends AsyncTask<URL, Integer, Long> {
AlertDialog.Builder mDialog;
protected void onPreExecute() {
super.onPreExecute();
mDialog = new AlertDialog.Builder(ClientSignActivity.this);
mDialog.setCancelable(false);
}
protected Long doInBackground(URL... urls) {
//int count = urls.length;
long totalSize = 0;
String response = "";
File signatureFile = new File(signaturePhotoPath);
File photoFile = new File(StaticValues.currentPhotoPath);
String boundary = "*****";//Long.toHexString(System.currentTimeMillis());
String CRLF = "\r\n";
String charset = "UTF-8";
try {
URLConnection mConnection = urls[0].openConnection();
mConnection.setDoOutput(true);
((HttpURLConnection)mConnection).setRequestMethod("POST");
//mConnection.setRequestProperty("Connection", "Keep-Alive"); // would this line of code help?
mConnection.setRequestProperty("Cache-Control", "no-cache"); // this one?
mConnection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
OutputStream output = mConnection.getOutputStream();
PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, charset));
writer.append("--" + boundary).append(CRLF);
writer.append("Content-Disposition: form-data; name=\"dentistName\"").append(CRLF);
writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF);
writer.append(CRLF).append("A string here").append(CRLF).flush();
writer.append("--" + boundary).append(CRLF);
writer.append("Content-Disposition: form-data; name=\"patientName\"").append(CRLF);
writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF);
writer.append(CRLF).append("Another string here").append(CRLF).flush();
writer.append("--" + boundary).append(CRLF);
writer.append("Content-Disposition: form-data; name=\"patientPhone\"").append(CRLF);
writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF);
writer.append(CRLF).append("A third string").append(CRLF).flush();
//set up image stuff
InputStream is;
int c;
byte[] buf;
//send image
writer.append("--" + boundary).append(CRLF);
writer.append("Content-Disposition: form-data; name=\"patientPhoto\"; filename=\"" + photoFile.getName() + "\"").append(CRLF);
writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF);
writer.append(CRLF).flush();
c = 0;
is = new FileInputStream(StaticValues.patientBitmapToSend);
buf = new byte[8192];
while ((c = is.read(buf, 0, buf.length)) > 0) {
output.write(buf, 0, c);
output.flush();
}
output.flush();
writer.append(CRLF).flush();
//send another photo
writer.append("--" + boundary).append(CRLF);
writer.append("Content-Disposition: form-data; name=\"signaturePhoto\"; filename=\"" + signatureFile.getName() + "\"").append(CRLF);
writer.append("Content-Type: text/plain; charset=" + charset).append(CRLF);
writer.append(CRLF).flush();
c = 0;
is = new FileInputStream(signatureFile);
buf = new byte[8192];
while ((c = is.read(buf, 0, buf.length)) > 0) {
output.write(buf, 0, c);
output.flush();
}
output.flush();
writer.append(CRLF).flush();
//end of multipart/form-data
writer.append("--" + boundary + "--").append(CRLF).flush();
Log.d("content: ", mConnection.getContent().toString());
int responseCode = ((HttpURLConnection) mConnection).getResponseCode();
if (responseCode == HttpsURLConnection.HTTP_OK) {
String line;
BufferedReader br = new BufferedReader(new InputStreamReader(mConnection.getInputStream()));
while ((line = br.readLine()) != null) {
response += line;
}
sendStuffResponse = response;
} else {
response = "failed";
}
//finally,
Log.d("Response: ", response);
((HttpURLConnection) mConnection).disconnect();
//cleanup
(new File(StaticValues.currentPhotoPath)).delete();
photoFile.delete();
signatureFile.delete();
} catch (Exception e) {
e.printStackTrace();
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
//setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
super.onPostExecute(result);
progressDialog.dismiss();
mDialog.setTitle(R.string.upload_success_title);
mDialog.setMessage(R.string.upload_success_str); //DEBUG sendStuffResponse
mDialog.setPositiveButton(R.string.ok_str, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int id) {
finish();
}
});
mDialog.create().show();
//Toast.makeText(getApplicationContext(), "Downloaded " + result + " bytes", Toast.LENGTH_LONG).show();
}
}
Любая помощь будет оценена. Благодаря!
'улов (Исключение е) { e.printStackTrace(); } '. Этот блок catch пуст. Итак, если есть уловка, как вы сообщаете об этом пользователю? На данный момент совсем нет. Поэтому пользователь никогда не знает, что-то пошло не так. И вы тоже. – greenapps
Хорошая точка, я должен добавить сообщение об ошибке, однако я знаю, что изображение не достигает сервера, потому что я вижу, что только 169 байт сделали это и что файл был пуст. Он также дает код ответа 500. –
Доступен ли сервер только из вашей внутренней сети? Существует ли межсетевой экран между внешней сетью и вашей? –