我正在使用HttpURLConnection上传到服务器的视频(以及照片)。
我有一个视频的Uri。我这样打开一个InputStream:
InputStream inputStream = context.getContentResolver().openInputStream(uri);
由于视频文件非常大,我在将数据写入outputStream时无法缓冲数据。所以我需要使用HttpURLConnection的setFixedLengthStreamingMode(contentLength)方法。但它需要“contentLength”。 问题是,如何获得视频的长度?
请不要建议获取文件路径。在某些设备上它可以工作,但它经常失败(特别是在Android 6上)。他们说Uri不一定代表文件。
我也偶然发现在打开设备库(使用Intent)后我收到了一张图片的Uri,但是我没有尝试从中获取文件路径。所以我认为从Uri获取文件路径不是一个好方法吗?
答案 0 :(得分:1)
尝试这样的事情:
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