我正在尝试将一些数据上传到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();
}
}
任何帮助将不胜感激。谢谢!
答案 0 :(得分:0)
我发现了什么问题。服务器上的脚本在所有图像数据到达之前运行。 Heroku设置为直接将图像发送到s3: https://devcenter.heroku.com/articles/s3