Android文件上传工作不一致

时间:2016-11-29 17:49:43

标签: php android heroku

我正在尝试将一些数据上传到Heroku / PHP服务器,并且出于某种原因,它的工作方式不一致。它在我们的办公室对我来说非常好,但当其他人尝试使用我们的应用程序时,没有文件到达服务器。服务器提供一个"空文件"错误。

以下是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();
    }
}

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

我发现了什么问题。服务器上的脚本在所有图像数据到达之前运行。 Heroku设置为直接将图像发送到s3: https://devcenter.heroku.com/articles/s3