从内容解析器打开的输入流中获取数据长度
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
我正在使用 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