2016-11-29 3 views
0

Я пытаюсь загрузить некоторые данные на сервер 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(); 
    } 
} 

Любая помощь будет оценена. Благодаря!

+0

'улов (Исключение е) { e.printStackTrace(); } '. Этот блок catch пуст. Итак, если есть уловка, как вы сообщаете об этом пользователю? На данный момент совсем нет. Поэтому пользователь никогда не знает, что-то пошло не так. И вы тоже. – greenapps

+0

Хорошая точка, я должен добавить сообщение об ошибке, однако я знаю, что изображение не достигает сервера, потому что я вижу, что только 169 байт сделали это и что файл был пуст. Он также дает код ответа 500. –

+0

Доступен ли сервер только из вашей внутренней сети? Существует ли межсетевой экран между внешней сетью и вашей? –

ответ

0

Я узнал, что случилось. Скрипт на сервере выполнялся до того, как все данные изображения прибыли. Heroku устанавливается непосредственно отправлять изображения s3: https://devcenter.heroku.com/articles/s3

Смежные вопросы