gpt4 book ai didi

java - HTTPURLConnection.getInputStream() 需要很长时间?

转载 作者:太空宇宙 更新时间:2023-11-03 13:35:51 26 4
gpt4 key购买 nike

我正在使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com