- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我从我的大学获得了 SAS token 。 SAS token 如下所示:
他说我可以用它来创建容器并将数据推送到这个容器中。所以我开始在一些示例的帮助下编码。我想出了这个:
public ContainerURL getContainerURL() throws MalformedURLException {
// From the Azure portal, get your Storage account's name and account key.
String storgeResourceUri = "https://<account>.blob.core.windows.net";
String sasToken = "https://myaccount.blob.core.windows.net/?sv=2015-04-05&st=2015-04-29T22%3A18%3A26Z&se=2015-04-30T02%3A23%3A26Z&sr=b&sp=rw&sip=168.1.5.60-168.1.5.70&spr=https&sig=Z%2FRHIX5Xcg0Mq2rqI3OlWTjEg2tYkboXr1P9ZUXDtkk%3D";
StorageCredentialsSharedAccessSignature creds = new StorageCredentialsSharedAccessSignature(sasToken);
// Create a ServiceURL objet that wraps the service URL and a request pipeline.
ServiceURL serviceURL = new ServiceURL(new URL(storgeResourceUri), StorageURL.createPipeline(creds, new PipelineOptions()));
// Now you can use the ServiceURL to perform various container and blob operations.
// This example shows several common operations just to get you started.
/*
Create a URL that references a to-be-created container in your Azure Storage account. This returns a
ContainerURL object that wraps the container's URL and a request pipeline (inherited from serviceURL).
Note that container names require lowercase.
*/
return serviceURL.createContainerURL("mapupdate-container");
}
public void uploadFile(ContainerURL containerURL, File sourceFile) throws IOException {
String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());
File zippedFile = zipping(sourceFile, timeStamp);
BlockBlobURL blobURL = containerURL.createBlockBlobURL(zippedFile.getName());
AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(zippedFile.toPath());
// Uploading a file to the blobURL using the high-level methods available in TransferManager class
// Alternatively call the Upload/StageBlock low-level methods from BlockBlobURL type
TransferManager.uploadFileToBlockBlob(fileChannel, blobURL, (int) zippedFile.length(), null)
.subscribe(response -> {
System.out.println("Completed upload request.");
System.out.println(response.response().statusCode());
});
}
它应该创建一个名为“mapudpater-container”的容器,然后上传一个压缩文件。之后我想通过 mqtt 发送它,以便另一个客户端可以使用链接下载它。
我不知道如何使用 SAS token 访问 Azure Blob 存储帐户并创建容器并将文件上传到容器中。我应该为每个文件创建一个新容器吗?我怎样才能获得下载链接?我是否必须创建自己的 SAS token 才能下载它?
最佳答案
有两种方法可以与 AzureBlobStorage 交互并使用 Java 管理文件,
Azure 存储 Blob - 它使用基于 REST 的机制来连接 Azure 存储 Blob 并管理文件。速度相对较慢。
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-storage-blob</artifactId>
<version>11.0.0</version>
</dependency>
Azure 存储 - 它是 Azure 提供的云 API,比基于 REST 的 API 更快
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-storage</artifactId>
<version>8.6.4</version>
</dependency>
下面已为两种类型的实现创建了实用程序:
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.ByteBuffer;
import java.security.InvalidKeyException;
import java.util.Calendar;
import java.util.EnumSet;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.Objects;
import java.util.TimeZone;
import com.microsoft.azure.storage.CloudStorageAccount;
import com.microsoft.azure.storage.StorageException;
import com.microsoft.azure.storage.blob.BlockBlobURL;
import com.microsoft.azure.storage.blob.CloudBlobClient;
import com.microsoft.azure.storage.blob.CloudBlobContainer;
import com.microsoft.azure.storage.blob.CloudBlockBlob;
import com.microsoft.azure.storage.blob.ContainerURL;
import com.microsoft.azure.storage.blob.DownloadResponse;
import com.microsoft.azure.storage.blob.PipelineOptions;
import com.microsoft.azure.storage.blob.ServiceURL;
import com.microsoft.azure.storage.blob.SharedAccessBlobPermissions;
import com.microsoft.azure.storage.blob.SharedAccessBlobPolicy;
import com.microsoft.azure.storage.blob.SharedKeyCredentials;
import com.microsoft.azure.storage.blob.StorageURL;
import com.microsoft.azure.storage.blob.models.BlobDeleteResponse;
import com.microsoft.azure.storage.blob.models.BlockBlobUploadResponse;
import com.microsoft.azure.storage.core.Base64;
import com.microsoft.rest.v2.http.HttpPipeline;
import com.microsoft.rest.v2.util.FlowableUtil;
import io.reactivex.Flowable;
import io.reactivex.Single;
public class AzureStorageUtils {
public static void main(String...args) throws Exception {
FileInputStream fis = new FileInputStream("test.pdf");
int available = fis.available();
byte[] buffer = new byte[available];
fis.read(buffer);
fis.close();
String accountName = "enter azure account name";
String accountKey = "enter account key ";
BlobFile file = new BlobFile();
file.setFileType("image");
file.setFileName("directory1/image.pdf");
file.setFileSize(available);
file.setContent(buffer);
long startTime = System.currentTimeMillis();
uploadFile(accountName, accountKey, file);
//deleteFile(accountName, accountKey, file);
long endTime = System.currentTimeMillis();
System.out.println("Start Time: " + startTime);
System.out.println("End Time: " + endTime);
System.out.println("Time Taken: " + (endTime - startTime));
String connectionString = "entery connection string for azure blob";
startTime = System.currentTimeMillis();
create(connectionString, "image", "directory1/image.pdf", buffer);
endTime = System.currentTimeMillis();
System.out.println("Start Time: " + startTime);
System.out.println("End Time: " + endTime);
System.out.println("Time Taken: " + (endTime - startTime));
startTime = System.currentTimeMillis();
byte[] temp = read(connectionString, "image", "directory1/image.pdf");
System.out.println(Base64.encode(temp));
endTime = System.currentTimeMillis();
System.out.println("Start Time: " + startTime);
System.out.println("End Time: " + endTime);
System.out.println("Time Taken: " + (endTime - startTime));
startTime = System.currentTimeMillis();
String sasURL = sasURL(connectionString, "image", "directory1/image.pdf");
System.out.println(sasURL);
endTime = System.currentTimeMillis();
System.out.println("Start Time: " + startTime);
System.out.println("End Time: " + endTime);
System.out.println("Time Taken: " + (endTime - startTime));
startTime = System.currentTimeMillis();
delete(connectionString, "image", "directory1/image.pdf");
endTime = System.currentTimeMillis();
System.out.println("Start Time: " + startTime);
System.out.println("End Time: " + endTime);
System.out.println("Time Taken: " + (endTime - startTime));
}
/**
* azure-storage
*/
private static CloudBlobClient createCloudBlobClient(String connectionString) throws InvalidKeyException, URISyntaxException {
CloudStorageAccount account = CloudStorageAccount.parse(connectionString);
return account.createCloudBlobClient();
}
private static CloudBlobContainer getBlobConatiner(String connectionString, String containerName) throws InvalidKeyException, URISyntaxException, StorageException {
CloudBlobClient cloudBlobClient = createCloudBlobClient(connectionString);
CloudBlobContainer cloudBlobContainer = cloudBlobClient.getContainerReference(containerName);
cloudBlobContainer.createIfNotExists();
return cloudBlobContainer;
}
public static CloudBlockBlob create(String connectionString, String containerName, String filePath, byte[] data) throws RuntimeException {
try {
CloudBlobContainer cloudBlobContainer = getBlobConatiner(connectionString, containerName);
CloudBlockBlob cloudBlockBlob = cloudBlobContainer.getBlockBlobReference(filePath);
cloudBlockBlob.uploadFromByteArray(data, 0, data.length);
return cloudBlockBlob;
}
catch(InvalidKeyException | URISyntaxException | StorageException | IOException ex) {
throw new RuntimeException();
}
}
public static byte[] read(String connectionString, String containerName, String filePath) throws RuntimeException {
try {
CloudBlobContainer cloudBlobContainer = getBlobConatiner(connectionString, containerName);
CloudBlockBlob cloudBlockBlob = cloudBlobContainer.getBlockBlobReference(filePath);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
cloudBlockBlob.download(outputStream);
byte[] byteArray = outputStream.toByteArray();
outputStream.close();
return byteArray;
}
catch(InvalidKeyException | URISyntaxException | StorageException | IOException ex) {
throw new RuntimeException();
}
}
public static boolean delete(String connectionString, String containerName, String filePath) throws RuntimeException {
try {
CloudBlobContainer cloudBlobContainer = getBlobConatiner(connectionString, containerName);
CloudBlockBlob cloudBlockBlob = cloudBlobContainer.getBlockBlobReference(filePath);
return cloudBlockBlob.deleteIfExists();
}
catch(InvalidKeyException | URISyntaxException | StorageException ex) {
throw new RuntimeException();
}
}
public static String sasURL(String connectionString, String containerName, String filePath) throws RuntimeException {
try {
CloudBlobContainer cloudBlobContainer = getBlobConatiner(connectionString, containerName);
CloudBlockBlob cloudBlockBlob = cloudBlobContainer.getBlockBlobReference(filePath);
SharedAccessBlobPolicy sasPolicy = new SharedAccessBlobPolicy();
GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
calendar.add(Calendar.HOUR, 10);
sasPolicy.setSharedAccessExpiryTime(calendar.getTime());
sasPolicy.setPermissions(EnumSet.of(SharedAccessBlobPermissions.READ, SharedAccessBlobPermissions.WRITE, SharedAccessBlobPermissions.LIST));
String sas = cloudBlockBlob.generateSharedAccessSignature(sasPolicy,null);
return cloudBlockBlob.getUri()+"?"+sas;
}
catch(InvalidKeyException | URISyntaxException | StorageException ex) {
throw new RuntimeException();
}
}
/**
* azure-storage-blob
*/
private static BlockBlobURL getBlobURL(String accountName, String accountKey, String containerName, String filename) throws Exception {
ContainerURL containerURL = null;
BlockBlobURL blobURL = null;
try {
SharedKeyCredentials credential = new SharedKeyCredentials(accountName, accountKey);
HttpPipeline pipeline = StorageURL.createPipeline(credential, new PipelineOptions());
URL url = new URL(String.format(Locale.ROOT, "https://%s.blob.core.windows.net", accountName));
ServiceURL serviceURL = new ServiceURL(url, pipeline);
containerURL = serviceURL.createContainerURL(containerName);
blobURL = containerURL.createBlockBlobURL(filename);
} catch (Exception e) {
throw new Exception(e.getMessage());
}
return blobURL;
}
public static boolean uploadFile(String accountName, String accountKey, BlobFile file) throws Exception {
boolean isUploaded = false;
if (Objects.isNull(file.getFileType())) {
throw new Exception("FileType is missing");
}
if (Objects.isNull(file.getFileName())) {
throw new Exception("FileName is missing");
}
if (Objects.isNull(file.getContent())) {
throw new Exception("Content is missing");
}
if (file.getFileSize() == 0) {
throw new Exception("File's size is missing");
}
BlockBlobURL blobURL = getBlobURL(accountName, accountKey, file.getFileType(), file.getFileName());
Single<BlockBlobUploadResponse> blobResponse = blobURL.upload(Flowable.just(ByteBuffer.wrap(file.getContent())), file.getFileSize(), null, null, null, null);
if (blobResponse.blockingGet().statusCode() == 201) {
isUploaded = true;
}
return isUploaded;
}
public static BlobFile downloadFile(String accountName, String accountKey, BlobFile file) throws Exception {
if (Objects.isNull(file.getFileType())) {
throw new Exception("FileType is missing");
}
if (Objects.isNull(file.getFileName())) {
throw new Exception("FileName is missing");
}
BlockBlobURL blobURL = getBlobURL(accountName, accountKey, file.getFileType(), file.getFileName());
Single<DownloadResponse> blobResponse = blobURL.download(null, null, false, null);
Flowable<ByteBuffer> fByteBuffer = blobResponse.blockingGet().body(null);
Single<ByteBuffer> bf = FlowableUtil.collectBytesInBuffer(fByteBuffer);
file.setContent(bf.blockingGet().array());
return file;
}
public static boolean deleteFile(String accountName, String accountKey, BlobFile file) throws Exception {
boolean flag = false;
if (Objects.isNull(file.getFileType())) {
throw new Exception("FileType is missing");
}
if (Objects.isNull(file.getFileName())) {
throw new Exception("FileName is missing");
}
BlockBlobURL blobURL = getBlobURL(accountName, accountKey, file.getFileType(), file.getFileName());
Single<BlobDeleteResponse> blobResponse = blobURL.delete(null, null, null);
if (blobResponse.blockingGet().statusCode() == 201) {
flag = true;
}
return flag;
}
}
上述解决方案具有两种实现方式,我们还比较了相同 Activity (例如上传相同文件)所需的时间。
首选方法是使用 azure-storage 依赖项。
关于java - 如何使用 AzureBlobStorage Java SDK v10 仅使用 SAS 创建容器并上传数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54749414/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!