2016-11-29 3 views
0

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!

+0

'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

+0

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. –

+0

Ist der Server nur von Ihrem internen Netzwerk zugänglich? Gibt es eine Firewall zwischen dem externen und Ihrem Netzwerk? –

Antwort

0

Ich fand heraus, was falsch war. Das Skript auf dem Server wurde ausgeführt, bevor alle Bilddaten angekommen sind. Heroku eingerichtet ist, um Bilder direkt zum s3 senden: https://devcenter.heroku.com/articles/s3