Java在Android上通过HTTP POST分块上传文件

4
我被要求使用HTTP POST发送文件。每个文件应该分成1MB的块进行发送。我查看了这段代码 IntentService上传文件,看起来我可以在我的情况下使用它。但是,我必须在URL中作为参数提供我发送的块的起始字节。因此,我不确定如何完成它。我应该为每个块实例化一个新连接并使用新的URL吗?还是我可以使用流方法,在块写入输出流之前以某种方式更改URL?

“Chunks”是什么意思?所有内容都在一个HTTP连接中吗?还是每个块都需要一个连接?你应该问给你这个任务的人。 - greenapps
2个回答

3

只需使用URLHttpURLConnection,并调用setChunkedTransferMode()函数,并设置所需的块大小。

除非您有未告诉我们的情况,否则不需要设置起始字节。


如果由于连接问题导致崩溃,我们该如何从上次崩溃发生的地方恢复?我在谈论恢复控制。 - Abhinav Saxena
只需在“URLConnection”上设置适当的标头值,并在开始传输之前将输入指向相同位置。 - user207421

2

可以使用MultipartEntity来完成此操作。以下代码将帮助您理解。

    final int cSize = 1024 * 1024; // size of chunk
    File file = new File("path to file");
    final long pieces = file.length()/cSize // used to return file length.

    HttpPost request = new HttpPost(endpoint);

    BufferedInputStream stream = new BufferedInputStream(new FileInputStream(file));

    for (int i= 0; i< pieces; i++) {
        byte[] buffer = new byte[cSize];

        if(stream.read(buffer) ==-1)
          break;

        MultipartEntity entity = new MultipartEntity();
        entity.addPart("chunk_id", new StringBody(String.valueOf(i))); //Chunk Id used for identification.
        request.setEntity(entity);
        ByteArrayInputStream arrayStream = new ByteArrayInputStream(buffer);

        entity.addPart("file_data", new InputStreamBody(arrayStream, filename));

        HttpClient client = app.getHttpClient();
        client.execute(request);
    }

@ greenapps 我已经添加了一些注释到代码中,使其更加清晰。 - Muthu
1
pieces = file.length() 应改为 pieces=file.length()/cSize;stream.skip(i* cSize); 这条语句应该被移除。valueOf(id) 更好的写法是 valueOf(i); - greenapps
1
stream.read(buffer); 你应该检查返回值。pieces 不会包括文件的最后一部分,因此会丢失。 - greenapps
1
你完全错了。如果pieces等于file.length(),那么for循环将会执行file.length次,超过数百万次。这是你想要的吗?显然你从未测试过那段代码。 - greenapps
1
我的天啊,为什么我必须重复这些事情?我说的一切仍然是真的。 - greenapps
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接