如何使用 Azure SAS url 从 Android 设备上传媒体 (.mp4) 文件
How to upload media (.mp4) file using Azure SAS url from Android device
我正在 android 上构建丰富的视频库并尝试上传视频,因为我不希望客户端访问我的媒体密钥和我调用我的服务器的其他详细信息 return SAS url 作为客户端将用于上传媒体的响应
只是想知道在这里实现上传的最佳方法是什么,我尝试使用 okHttp 库并且大部分时间都成功了()我有几次遇到大文件的 scoket 超时异常)但不确定 okHttp 与 azure 的性能如何,
从理论上讲,将媒体文件分块并上传总是好的,所以谁能告诉我使用 SAS android 在 azure blob 中上传文件的最佳方法是什么 url
除了上传大文件,您可以尝试将它们切成块,然后上传不超过 4Mb 的独立文件。一旦所有的片段(块)都上传了,你需要将它们全部提交并给出它们应该出现的顺序。
有关更多信息,您可以参考 this similar topic 来自 SO。
编辑:
这是一个示例 Java 代码,适用于 OkHttp 3.6.0 和 SAS URL。
public class UploadBlobUsingSASUrl {
public static void main(String[] args) throws IOException {
UploadBlobUsingSASUrl uploadHandler = new UploadBlobUsingSASUrl();
String sasSignature = "?sv=2016-05-31&ss=bfqt&srt=sco&sp=rwdlacup&se=2017-03-30T23:39:00Z&st=2017-03-20T15:39:00Z&spr=https&sig=A2m1O5qZf79L7925DHMJtfkBRI6GVFhYcrGLStBo%2BL0%3D";
String blobStorageEndpoint = "https://<your-account>.blob.core.windows.net/<your-container>/<your-blob>" + sasSignature;
InputStream inStream = new FileInputStream("<file-path>");
BufferedInputStream bis = new BufferedInputStream(inStream);
List<String> blockIds = new ArrayList<String>();
int counter = 1;
while (bis.available() > 0) {
int blockSize = 4 * 1024 * 1024; // 4 MB;
int bufferLength = bis.available() > blockSize ? blockSize : bis.available();
byte[] buffer = new byte[bufferLength];
bis.read(buffer, 0, buffer.length);
String blockId = Base64.getEncoder().encodeToString(("Block-" + counter++).getBytes("UTF-8"));
uploadHandler.UploadBlock(blobStorageEndpoint, buffer, blockId);
blockIds.add(blockId);
}
uploadHandler.CommitBlockList(blobStorageEndpoint, blockIds);
bis.close();
inStream.close();
}
public void UploadBlock(String baseUri, byte[] blockContents, String blockId) throws IOException {
OkHttpClient client = new OkHttpClient();
MediaType mime = MediaType.parse("");
RequestBody body = RequestBody.create(mime, blockContents);
String uploadBlockUri = baseUri + "&comp=block&blockId=" + blockId;
Request request = new Request.Builder()
.url(uploadBlockUri)
.put(body)
.addHeader("x-ms-version", "2015-12-11")
.addHeader("x-ms-blob-type", "BlockBlob")
.build();
client.newCall(request).execute();
}
public void CommitBlockList(String baseUri, List<String> blockIds) throws IOException {
OkHttpClient client = new OkHttpClient();
StringBuilder blockIdsPayload = new StringBuilder();
blockIdsPayload.append("<?xml version='1.0' ?><BlockList>");
for (String blockId : blockIds) {
blockIdsPayload.append("<Latest>").append(blockId).append("</Latest>");
}
blockIdsPayload.append("</BlockList>");
String putBlockListUrl = baseUri + "&comp=blocklist";
MediaType contentType = MediaType.parse("");
RequestBody body = RequestBody.create(contentType, blockIdsPayload.toString());
Request request = new Request.Builder()
.url(putBlockListUrl)
.put(body)
.addHeader("x-ms-version", "2015-12-11")
.build();
client.newCall(request).execute();
}
我正在 android 上构建丰富的视频库并尝试上传视频,因为我不希望客户端访问我的媒体密钥和我调用我的服务器的其他详细信息 return SAS url 作为客户端将用于上传媒体的响应
只是想知道在这里实现上传的最佳方法是什么,我尝试使用 okHttp 库并且大部分时间都成功了()我有几次遇到大文件的 scoket 超时异常)但不确定 okHttp 与 azure 的性能如何,
从理论上讲,将媒体文件分块并上传总是好的,所以谁能告诉我使用 SAS android 在 azure blob 中上传文件的最佳方法是什么 url
除了上传大文件,您可以尝试将它们切成块,然后上传不超过 4Mb 的独立文件。一旦所有的片段(块)都上传了,你需要将它们全部提交并给出它们应该出现的顺序。
有关更多信息,您可以参考 this similar topic 来自 SO。
编辑:
这是一个示例 Java 代码,适用于 OkHttp 3.6.0 和 SAS URL。
public class UploadBlobUsingSASUrl {
public static void main(String[] args) throws IOException {
UploadBlobUsingSASUrl uploadHandler = new UploadBlobUsingSASUrl();
String sasSignature = "?sv=2016-05-31&ss=bfqt&srt=sco&sp=rwdlacup&se=2017-03-30T23:39:00Z&st=2017-03-20T15:39:00Z&spr=https&sig=A2m1O5qZf79L7925DHMJtfkBRI6GVFhYcrGLStBo%2BL0%3D";
String blobStorageEndpoint = "https://<your-account>.blob.core.windows.net/<your-container>/<your-blob>" + sasSignature;
InputStream inStream = new FileInputStream("<file-path>");
BufferedInputStream bis = new BufferedInputStream(inStream);
List<String> blockIds = new ArrayList<String>();
int counter = 1;
while (bis.available() > 0) {
int blockSize = 4 * 1024 * 1024; // 4 MB;
int bufferLength = bis.available() > blockSize ? blockSize : bis.available();
byte[] buffer = new byte[bufferLength];
bis.read(buffer, 0, buffer.length);
String blockId = Base64.getEncoder().encodeToString(("Block-" + counter++).getBytes("UTF-8"));
uploadHandler.UploadBlock(blobStorageEndpoint, buffer, blockId);
blockIds.add(blockId);
}
uploadHandler.CommitBlockList(blobStorageEndpoint, blockIds);
bis.close();
inStream.close();
}
public void UploadBlock(String baseUri, byte[] blockContents, String blockId) throws IOException {
OkHttpClient client = new OkHttpClient();
MediaType mime = MediaType.parse("");
RequestBody body = RequestBody.create(mime, blockContents);
String uploadBlockUri = baseUri + "&comp=block&blockId=" + blockId;
Request request = new Request.Builder()
.url(uploadBlockUri)
.put(body)
.addHeader("x-ms-version", "2015-12-11")
.addHeader("x-ms-blob-type", "BlockBlob")
.build();
client.newCall(request).execute();
}
public void CommitBlockList(String baseUri, List<String> blockIds) throws IOException {
OkHttpClient client = new OkHttpClient();
StringBuilder blockIdsPayload = new StringBuilder();
blockIdsPayload.append("<?xml version='1.0' ?><BlockList>");
for (String blockId : blockIds) {
blockIdsPayload.append("<Latest>").append(blockId).append("</Latest>");
}
blockIdsPayload.append("</BlockList>");
String putBlockListUrl = baseUri + "&comp=blocklist";
MediaType contentType = MediaType.parse("");
RequestBody body = RequestBody.create(contentType, blockIdsPayload.toString());
Request request = new Request.Builder()
.url(putBlockListUrl)
.put(body)
.addHeader("x-ms-version", "2015-12-11")
.build();
client.newCall(request).execute();
}