当前位置: 首页 > 知识库问答 >
问题:

在android中,使用带有多部分的HttpUrlConnection上传文件的速度非常快

阳狐若
2023-03-14

我正在尝试使用HttpUrlConnection POST方法使用multipart上传文件。文件上传正确,我收到了响应。但是当我跟踪进度时,它只是在1秒内给出所有进度,即使是文件。

这是我上传文件的代码:

//Initialised in Constructor
 boundary = twoHyphens + System.currentTimeMillis() + twoHyphens;

    URL url = new URL(requestURL);
    private HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
    httpConn.setUseCaches(false);
    httpConn.setDoOutput(true);
    httpConn.setDoInput(true);
    httpConn.setRequestMethod("POST");
    httpConn.setRequestProperty("Connection", "Keep-Alive");
    httpConn.setRequestProperty("Content-Type",
            "multipart/form-data; boundary=" + boundary);

   //This method is called to upload a file
   public String uploadFile(String fieldName, File uploadFile) throws IOException, InterruptedException {
    String fileName = uploadFile.getName();
    FileInputStream fileInputStream = new FileInputStream(uploadFile);
    DataOutputStream dataOutputStream = new DataOutputStream(new BufferedOutputStream(httpConn.getOutputStream()));

    dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd);
    dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"" + fieldName
            + "\"; filename=\"" + fileName + "\"" + lineEnd);
    dataOutputStream.writeBytes(lineEnd);

    int bytesRead, bytesAvailable, bufferSize;
    byte[] buffer;
    int maxBufferSize = 1 * 1024 * 1024;

    //returns no. of bytes present in fileInputStream
    bytesAvailable = fileInputStream.available();

    bufferSize = 4096;
    buffer = new byte[4096];
    long size = uploadFile.length();

    bytesRead = fileInputStream.read(buffer, 0, bufferSize);

     while (bytesRead > 0) {
        int percentage = (int) ((bytesRead / (float) size) * 100);
        dataOutputStream.write(buffer, 0, bufferSize);
        dataOutputStream.flush(); //doesn't help
        bytesAvailable = fileInputStream.available();
        bytesRead = fileInputStream.read(buffer, 0, bufferSize);
    }//This finishes in 1 second

    dataOutputStream.writeBytes(lineEnd);
    dataOutputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

    int status = httpConn.getResponseCode();
    StringBuilder sb = new StringBuilder();
    BufferedReader reader = null;

    try {
        if (status == HttpURLConnection.HTTP_OK) {
            reader = new BufferedReader(new InputStreamReader(httpConn.getInputStream(), "UTF-8"));
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
        } else {
            throw new IOException("Server exception with status code: " + status);
        }
    } catch (Exception e) {

    } finally {
        if (reader != null) {
            reader.close();
            httpConn.disconnect();
        }
    }
    return sb.toString();
}

任何帮助或解释,真的非常感谢。

共有1个答案

潘阳舒
2023-03-14

写入输出流实际上不会触发网络连接。数据上传到服务器是在调用getResponseCode()时完成的,我在其他回答中已经详细介绍过

只有当你有办法让getResseCode()报告进度时,否则你就没有办法监控进度。

 类似资料:
  • 我正在使用这个音频记录和视频文件,它是工作的,但我想用OKHTTP取代它。我没弄明白。有人能帮我一下吗?

  • 我正在使用Spring Boot 1.2。我想上传一个原始二进制文件到控制器。文件大小可能很大,因此我不想将整个请求保存在内存中,而是流式传输文件,事实上,文件是在传输开始时生成的,因此客户端甚至不知道文件的大小。我在这里看到了一个如何使用多部分编码的文件上传进行类似操作的示例。然而,我不想要一个多部分编码的上传,只是一个原始的字节流。我似乎找不到在Spring处理这个用例的方法。

  • 本文向大家介绍带有多个进度条的HTML5文件上传,包括了带有多个进度条的HTML5文件上传的使用技巧和注意事项,需要的朋友参考一下 为了使其正常工作,您需要解决xhr progress事件,该事件在所有列表项都已创建后就会触发。 该XHR 应该知道你想做什么-

  • 我试图实现一个进度条来指示一个多部分文件上传的进度。 有人能举个例子说明我会怎么做吗?

  • 我试图写一个通用代码上传文件到任何服务器(多部分职位)。< br >我已经在我的代码和各种stackoverflow解决方案中尝试了不同的头和请求类型,但仍然无法上传任何文件。 我不断收到以下HTML消息作为响应: 400 BAD请求 如何在Android中编写一个通用代码将文件上传到服务器?< br > Android代码:< br > 用于测试文件上传的 PHP 代码:

  • 在Android中使用OKHTTP以多部分方式上传单个大文件(更具体地说,上传到s3)时,我有什么选择?