Ich versuche, einige Daten auf einen Heroku/PHP-Server hochzuladen und aus irgendeinem Grund funktioniert es inkonsistent. Es funktioniert perfekt für mich in unserem Büro, aber wenn andere versuchen, unsere App zu verwenden, erreicht keine Datei jemals den Server. Der Server gibt einen Fehler "leere Datei".Android File Upload Inkonsistent arbeiten
Hier ist der Upload-Code von 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();
}
}
Jede Hilfe würde geschätzt. Vielen Dank!
'catch (Exception e) { e.printStackTrace(); } '. Dieser Fangblock ist leer. Also, wenn es einen Haken gibt, wie informieren Sie den Benutzer darüber? Im Moment gar nicht. So weiß der Benutzer nie, wenn etwas schief gelaufen ist. Und du auch nicht. – greenapps
Guter Punkt, ich sollte eine Fehlermeldung hinzufügen, aber ich weiß, dass kein Bild den Server erreicht, weil ich sehe, dass nur 169 Bytes gemacht und dass die Datei leer war. Es gibt auch einen Antwortcode von 500. –
Ist der Server nur von Ihrem internen Netzwerk zugänglich? Gibt es eine Firewall zwischen dem externen und Ihrem Netzwerk? –