Azure官网提供了比较详细的文档,您可以参考:https://azure.microsoft.com/en-us/documentation/articles/storage-java-how-to-use-blob-storage/#download-a-blob

或者,请参考下面的步骤:

  1. 下载Azure SDK for Java,地址为:https://azure.microsoft.com/en-us/documentation/articles/java-download-azure-sdk/
  2. 将Azure SDK for Java的jar包导入到项目中
  3. 参考本文最后附加的代码

代码说明如下:

  • 本人不是Java方面的专家,因而代码的规范性上或许不如你专业,你可以酌情调整。此外,代码仅作测试用,请勿用于生产环境
  • 测试附件中的代码的时候,需要在代码中替换你的:存储帐号名称、存储帐号密钥、容器名称、视频路径,如下图所示:

  • 附加的代码中,提供了两个方法,UploadSmallSize和UploadLargeSize用于视频是上传。对于大文件(超过100M),需要先将文件分片而后上传。这种情况下,请使用UploadLargeSize。
  • GetBlobUrl – 这个方法是用于返回Blob的URL。由于Blob在默认情况下无法直接通过URL访问,我们在这个方法中为Blob添加了SAS签名对Blob设置了权限,使得在一定时间范围内是可以访问的。关于SAS的更多内容,您可以参考:https://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-shared-access-signature-part-2/
 import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URISyntaxException;
import java.security.InvalidKeyException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.EnumSet;
import java.util.GregorianCalendar;
import java.util.Random;
import java.util.TimeZone; import javax.net.ssl.*; import com.microsoft.azure.storage.CloudStorageAccount;
import com.microsoft.azure.storage.StorageCredentials;
import com.microsoft.azure.storage.StorageCredentialsAccountAndKey;
import com.microsoft.azure.storage.StorageException;
import com.microsoft.azure.storage.blob.BlobContainerPermissions;
import com.microsoft.azure.storage.blob.BlobContainerPublicAccessType;
import com.microsoft.azure.storage.blob.BlockEntry;
import com.microsoft.azure.storage.blob.BlockSearchMode;
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.SharedAccessBlobPermissions;
import com.microsoft.azure.storage.blob.SharedAccessBlobPolicy; public class JavaStorageClient { static final String storageAccountName = "<Storage Account>";
static final String storageAccountKey = "<Storage Key>";
static final String containerName = "<Container Name>";
static final String videoPath = "<>";
//static final String videoPath = "D:\\Training\\all hands meeting-1.mp4"; static CloudStorageAccount storageAccount = null; private static void Init() throws InvalidKeyException, URISyntaxException, NoSuchAlgorithmException, KeyManagementException{
TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager(){public X509Certificate[] getAcceptedIssuers(){return null;}
public void checkClientTrusted(X509Certificate[] certs, String authType){}
public void checkServerTrusted(X509Certificate[] certs, String authType){}}};
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); StorageCredentials credentials = new StorageCredentialsAccountAndKey(storageAccountName, storageAccountKey);
String connectionString = String.format("DefaultEndpointsProtocol=https;AccountName=%s;AccountKey=%s;EndpointSuffix=core.Chinacloudapi.cn", storageAccountName, storageAccountKey);
storageAccount = CloudStorageAccount.parse(connectionString); } private static CloudBlobContainer GetContainer() throws URISyntaxException, StorageException{
CloudBlobClient blobClient = storageAccount.createCloudBlobClient();
CloudBlobContainer container;
container = blobClient.getContainerReference(containerName);
container.createIfNotExists(); return container;
} // For small size video, we can use this method.
private static void UploadSmallSize() throws URISyntaxException, StorageException, FileNotFoundException, IOException, InvalidKeyException{
System.out.println("===============Begin Uploading===============");
File source = new File(videoPath);
String blobName = source.getName();
CloudBlobContainer container = GetContainer();
CloudBlockBlob blob = container.getBlockBlobReference(source .getName()); blob.upload(new FileInputStream(source), source.length());
System.out.println("===============Uploading Done===============");
System.out.println("Blob URL: " + GetBlobUrl(container, blobName));
} private static void UploadLargeSize() throws URISyntaxException, StorageException, IOException, InvalidKeyException{
File source = new File(videoPath);
String blobName = source.getName();
FileInputStream inputStream = new FileInputStream(source);
final int blockLength = 1 * 1024*1024;
byte[] bufferBytes = new byte[blockLength];
int blockCount = (int)(source.length() / blockLength) + 1;
System.out.println("Total block count:"+blockCount+", Total size: "+source.length());
int currentBlockSize = 0; CloudBlobContainer container = GetContainer();
CloudBlockBlob blockBlobRef = container.getBlockBlobReference(blobName); System.out.println("===============Begin Uploading===============");
ArrayList<BlockEntry> blockList = new ArrayList<BlockEntry>(); for (int i = 0; i < blockCount; i++) {
//String blockID="OWM3MDhiMWEtODdhNS00YjE5LWE2NmEtYzAzMGJmZWIyYzli";//String.format("%09d", i);
//blockID=getBASE64(blockID);//Base64.encode(blockID.getBytes());
//String blockID="b"+String.valueOf(id);
//String blockID =Base64.encode(sid.getBytes());
//String.format("%08d", String.valueOf(10000+i));//String.valueOf(1000000+i);// Base64.encode(String.valueOf(1000000+i).getBytes());
String blockID = String.format("%08d", i);
currentBlockSize = blockLength;
if (i == blockCount - 1){
currentBlockSize = (int) (source.length() - blockLength * i);
bufferBytes = new byte[currentBlockSize];
} inputStream.read(bufferBytes, 0, currentBlockSize);
blockBlobRef.uploadBlock(blockID, getRandomDataStream(blockLength), blockLength, null, null, null);
blockList.add(new BlockEntry(blockID, BlockSearchMode.LATEST));
System.out.println("Submitted block index:" + i + ", BlockIndex:" + blockID);
}
blockBlobRef.commitBlockList(blockList);
System.out.println("===============Uploading Done==============="); System.out.println("Blob URL: " + GetBlobUrl(container, blobName));
} private static byte[] getRandomBuffer(int length) {
final Random randGenerator = new Random();
final byte[] buff = new byte[length];
randGenerator.nextBytes(buff);
return buff;
} private static ByteArrayInputStream getRandomDataStream(int length) {
return new ByteArrayInputStream(getRandomBuffer(length));
} private static String GetBlobUrl(CloudBlobContainer container, String blobName) throws StorageException, InvalidKeyException, URISyntaxException{
SharedAccessBlobPolicy policy = new SharedAccessBlobPolicy();
GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
calendar.setTime(new Date()); // Immediately applicable
policy.setSharedAccessStartTime(calendar.getTime()); // Applicable time span is 1 hour
calendar.add(Calendar.HOUR, 1);
policy.setSharedAccessExpiryTime(calendar.getTime()); // SAS grants READ access privileges
policy.setPermissions(EnumSet.of(SharedAccessBlobPermissions.READ));
BlobContainerPermissions containerPermissions = new BlobContainerPermissions(); // Private blob-container with no access for anonymous users
containerPermissions.setPublicAccess(BlobContainerPublicAccessType.OFF);
container.uploadPermissions(containerPermissions);
String sas = container.generateSharedAccessSignature(policy,null); CloudBlockBlob blob = container.getBlockBlobReference(blobName);
String blobUri = blob.getUri().toString(); return blobUri + "?"+ sas;
} public static void main(String[] args) throws FileNotFoundException, URISyntaxException, StorageException, IOException, InvalidKeyException, KeyManagementException, NoSuchAlgorithmException {
// TODO Auto-generated method stub
Init();
//UploadLargeSize();
UploadSmallSize();
} }

[Azure Storage]使用Java上传文件到Storage并生成SAS签名的更多相关文章

  1. SAE上传文件到storage

    还有什么比代码更清晰的讲解 html代码: 一定需要下面这个: method="post" enctype="multipart/form-data" < ...

  2. Java上传文件FTP服务器代码

    1. 在实际的应用重,通常是通过程序来进行文件的上传. 2. 实现java上传文件到ftp服务器中 新建maven项目 添加依赖 <dependency> <groupId>c ...

  3. java 上传文件到 ftp 服务器

    1.  java 上传文件到 ftp 服务器 package com.taotao.common.utils; import java.io.File; import java.io.FileInpu ...

  4. java 上传文件到七牛云中

    import com.alibaba.fastjson.JSONObject;import com.qiniu.common.QiniuException;import com.qiniu.commo ...

  5. Java 上传文件到 SFTP 抛异常 java.lang.NoClassDefFoundError: Could not initialize class sun.security.ec.SunEC 的解决办法

    最近从 Op 那里报来一个问题,说是SFTP上传文件不成功.拿到的 Exception 如下: Caused by: java.lang.NoClassDefFoundError: Could not ...

  6. Linux下vsftpd的安装,Java上传文件实现。

    首先我们需要查看是否已经安装vsftpd,输入命令 :vsftpd  -v.如果出现以下信息,那么就说明已经安装vsftpd 如果没有安装,那么输入命令   : yum  install vsftpd ...

  7. java上传文件代码

    import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;impo ...

  8. java上传文件工具类

    这个是之前整理之前所学时与使用java向邮箱发送邮件一块找到的,一起贴出来供大家参考: import java.awt.image.BufferedImage; import java.io.File ...

  9. java上传文件夹文件

    这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...

随机推荐

  1. Python列表边遍历边修改问题解决方案:alist[:]

    最近在看python,遇到个简单的问题:删除列表中指定的重复元素,发现一些实用并且有趣的东西. 1.错误示范 alist = [1,1,2,2,3,3,2,2,1,1] for i in alist: ...

  2. 栅格那点儿事(一)---Raster是个啥子东西

    Raster是个啥子东西 现如今,不仅是在遥感应用中能看到花花绿绿的影像了,在GIS应用中也能随处看到她们的身影.在各种在线地图中,卫星影像作为底图与矢量的道路层叠加:高程DEM作为高程来源实现地形的 ...

  3. Android 关于apk 打包后的地图定位和导航失败的问题

    项目中,使用了高德地图定位,调试的debug包定位完全没有问题,但是签名打包后,却始终无法定位,发现是测试环境下的SHA1码和签名发布版的SHA1码是不同的. 所以我们需要获取发布版的SHA1码: 方 ...

  4. Android基础Activity篇——Intent

    1.显式的Intent intent是用来各各活动之间切换的,还可以用来传递参数. 项目还是使用之前创建的ActivityTest项目,这里新建一个活动SecondActivity.java,并且勾选 ...

  5. java右移>> 无符号右移>>>

    >>>是无符号右移,在高位补零 >>是带符号的右移,如果是正数则在高位补零,负数则补1 int a = -1; System.out.println(a>>1 ...

  6. SharePoint 栏的三种名字Filed :StaticName、 InternalName、 DisplayName

    SharePoint 的栏,有3个名字, StaticName InternalName  DisplayName. 当在第一次创建栏的时候,这3个名字一起进行创建,并且都一样. <FIELD  ...

  7. 4 - 函数&装饰器 and 迭代器&生成器

    函数是什么 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的.程序里函数的定义是: 定义:将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 ...

  8. cesium 加载kml polygon和mark(贴地形terrain效果)

    key code: var options = { camera : viewer.scene.camera, canvas : viewer.scene.canvas, clampToGround: ...

  9. jQuery 效率提升建议

    jQuery简洁通用的方法集把编码者从繁重的工作中解脱出来,也拉低了进入javascript的门槛,初学者对浏览器兼容性一无所知的情况下,几行代码就可以写出超炫的特效.网上有一篇文章转载比较泛滥,已经 ...

  10. 【转】你是不是也被Android Private Libraries、Referenced Libraries、android Dependency搞晕了~~

    一.v4.v7.v13的作用和用法 1.Android Support V4, V7, V13是什么? 本质上就是三个java library. 2.为什么要有support库?   是为了解决软件的 ...