从内容解析器打开的输入流中获取数据长度

Get length of data from inputstream opened by content-resolver

我正在使用 HttpURLConnection 将视频(还有照片)上传到服务器。

我有一个视频的 Uri。我这样打开一个 InputStream:

    InputStream inputStream = context.getContentResolver().openInputStream(uri);

由于视频文件很大,我无法在将数据写入 outputStream 时缓冲数据。所以我需要使用 HttpURLConnection 的 setFixedLengthStreamingMode(contentLength) 方法。但它需要 "contentLength"。 问题是,如何获取视频的长度?

请不要建议获取文件路径。在某些设备上它可以工作,但经常会失败(尤其是在 Android 6 上)。他们说 Uri 不一定代表一个文件。

我也偶然发现在打开设备图库(使用 Intent)后收到图片的 Uri,但我无法从中获取文件路径。所以我认为这不是从 Uri 获取文件路径的好方法?

尝试这样的事情:

void uploadVideo() {

    InputStream inputStream = context.getContentResolver().openInputStream(uri);

    // Your connection.
    HttpURLConnection connection;

    // Do connection setup, setDoOutput etc.

    // Be sure that the server is able to handle
    // chunked transfer encoding.
    connection.setChunkedStreamingMode(0);

    OutputStream connectionOs = connection.getOutputStream();

    // Read and write a 4 KiB chunk a time.
    byte[] buffer = new byte[4096];
    int bytesRead;
    while ((bytesRead = inputStream.read(buffer)) != -1) {
        connectionOs.write(buffer, 0, bytesRead);
    }

    // Close streams, do connection etc.
}

更新:添加了setChunkedStreamingMode