我正在使用 HttpURLConnection 上传一个图像文件,对于一个包含所有标题的 5MB 文件大约需要 3 秒,但是当我使用 .getInputStream() 打开一个 InputStream 时,该方法需要大约 8 秒以上的时间来返回一个流与。这是一个问题,因为如果我有多个图像要上传,上传进度条似乎会提供糟糕的用户体验,每次上传之间会有相当长的停顿,所以进度条只会在上传之间停止几秒钟。我进行了一些谷歌搜索,但似乎没有其他人对此有异议?
通常我会假设服务器很慢,但鉴于上传只需要几秒钟,下载“成功”或“失败”这个词应该不是什么大问题!
这是一些代码!我最初设置错了吗? 注意:这也在 AsyncTask 中
ByteArrayInputStream fileInputStream = null;
try {
fileInputStream = new ByteArrayInputStream(dObject.Data);
} catch (Exception e) {
e.printStackTrace();
}
String lineEnd = "\r\n";
String twoHyphens = "--";
String boundary = "*****";
String Tag="3rd";
try
{
//------------------ CLIENT RE QUEST
Log.e(Tag,"Inside second Method");
// Open a HTTP connection to the URL
URL url = new URL(_urlString);
//connectURL is a URL object
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// Allow Inputs
conn.setDoInput(true);
// Allow Outputs
conn.setDoOutput(true);
// Don't use a cached copy.
conn.setUseCaches(false);
// Use a post method.
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);
DataOutputStream dos = new DataOutputStream( conn.getOutputStream() );
dos.writeBytes(twoHyphens + boundary + lineEnd);
//dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + _fileLocation +"\"" + lineEnd);
dos.writeBytes("Content-Disposition: form-data; name=\"file\";filename=\"" + _fileLocation +"\"" + lineEnd);
dos.writeBytes(lineEnd);
Log.e(Tag,"Headers are written");
// create a buffer of maximum size
int bytesAvailable = fileInputStream.available();
int maxBufferSize = 1024;
int bufferSize = Math.min(bytesAvailable, maxBufferSize);
byte[] buffer = new byte[bufferSize];
// read file and write it into form...
int bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0) {
dos.write(buffer, 0, bufferSize);
//int value = (int)(((float)((float)totalRead / (float) fileSize)) * 100);
totalRead += bytesRead;
//Publish the progress out to be displayed
publishProgress(totalRead);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
// send multipart form data necesssary after file data...
dos.writeBytes(lineEnd);
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
// close streams
Log.e(Tag,"File is written");
fileInputStream.close();
dos.flush();
Log.e("TIME", "PRE GETINPUTSTREAM");
InputStream is = conn.getInputStream();
Log.e("TIME", "POST GETINPUTSTREAM");
// retrieve the response from server
int ch;
//Build the respose and log
StringBuilder b =new StringBuilder();
while( ( ch = is.read() ) != -1 ){
b.append( (char)ch );
}
String s=b.toString();
Log.i("Response",s);
dos.close();
return;
}
catch (MalformedURLException ex)
{
ErrorHandler.get().e("3");
}
catch (IOException ioe)
{
ErrorHandler.get().e("2");
}
最佳答案
Normally I would assume the server is slow, but seeing as uploading only takes a couple of seconds, downloading the word 'success' or 'fail' shouldn't really be that much of an issue!
我怀疑真的是服务器慢了或者重载了。
服务器可能正在对 HTTP 请求进行排队,并且一次只能并行处理少量请求。
或者在将包含文件的响应写入响应之前执行的某些数据库 Activity 可能存在瓶颈。
或者它可以在内存缓冲区中动态生成文件(慢速),然后从缓冲区流式传输(快速)到 HTTP 响应。
或者像这样的其他解释......
(理论上也有可能发生了一些有趣的事情,减慢了向服务器发送请求的速度。不过我认为这不太可能。)
您是否尝试过使用网络浏览器下载相同的文件?你在那里有同样的行为吗?
关于java - HTTPURLConnection.getInputStream() 需要很长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7469974/