无法使用java代码从azure服务器下载图像
我已经通过java代码成功地在Azure服务器上上传了图像,但当我尝试下载图像时遇到了一个异常 要下载的代码:无法使用java代码从azure服务器下载图像,java,azure,Java,Azure,我已经通过java代码成功地在Azure服务器上上传了图像,但当我尝试下载图像时遇到了一个异常 要下载的代码: try { // Retrieve storage account from connection-string. CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString); // Create the blob client. CloudB
try
{
// Retrieve storage account from connection-string.
CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString);
// Create the blob client.
CloudBlobClient blobClient = storageAccount.createCloudBlobClient();
// Retrieve reference to a previously created container.
CloudBlobContainer container = blobClient.getContainerReference("mycontainer");
// Loop through each blob item in the container.
for (ListBlobItem blobItem : container.listBlobs()) {
// If the item is a blob, not a virtual directory.
if (blobItem instanceof CloudBlob) {
// Download the item and save it to a file with the same name.
CloudBlob blob = (CloudBlob) blobItem;
blob.download(new FileOutputStream("C:\\mydownloads\\" + blob.getName()));
}
}
}
在例外情况下
java.util.NoSuchElementException: An error occurred while enumerating the result, check the original exception for details.
at com.microsoft.windowsazure.storage.core.LazySegmentedIterator.hasNext(LazySegmentedIterator.java:113)
at com.test.BlobBasics.main(BlobBasics.java:106)
Caused by: com.microsoft.windowsazure.storage.StorageException: The server encountered an unknown failure: OK
at com.microsoft.windowsazure.storage.StorageException.translateException(StorageException.java:187)
at com.microsoft.windowsazure.storage.core.ExecutionEngine.executeWithRetry(ExecutionEngine.java:251)
at
... 1 more
Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.
at com.sun.xml.stream.XMLReaderImpl.next(XMLReaderImpl.java:563)
at com.microsoft.windowsazure.storage.blob.ListBlobsResponse.parseResponse(ListBlobsResponse.java:118)
at com.microsoft.windowsazure.storage.blob.CloudBlobContainer$6.postProcessResponse(CloudBlobContainer.java:1227)
at com.microsoft.windowsazure.storage.blob.CloudBlobContainer$6.postProcessResponse(CloudBlobContainer.java:1190)
at com.microsoft.windowsazure.storage.core.ExecutionEngine.executeWithRetry(ExecutionEngine.java:185)
... 2 more
他们使用下面的代码,这将对您有所帮助
public void downloadAttachment() {
try {
final String storageConnectionString = "DefaultEndpointsProtocol=http;" + "AccountName=your account name;" + "AccountKey=your account key";
// Retrieve storage account from connection-string.
CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString);
// Create the blob client.
CloudBlobClient blobClient = storageAccount.createCloudBlobClient();
// Get a reference to a container.
// The container name must be lower case
container = blobClient.getContainerReference("container name");
if (container.listBlobs() != null) {
Log.d("in if ", "list conatin value");
new downloadingAttachment().execute();
} else {
Log.d("in else ", "list does not any contain value ");
}
} catch (Exception e) {
// Output the stack trace.
e.printStackTrace();
}
}
public class downloadingAttachment extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
Log.d("in if ", "container.listBlobs();" + container.listBlobs());
Iterable<ListBlobItem> valuesofConatainer = container.listBlobs();
Log.d("in if ", "valuesofConatainer=" + valuesofConatainer);
for (ListBlobItem blobItem : container.listBlobs()) {
// If the item is a blob, not a virtual directory.
if (blobItem instanceof CloudBlob) {
// Download the item and save it to a file with the same name.
CloudBlob blob = (CloudBlob) blobItem;
try {
blob.download(new FileOutputStream("your storage location" + blob.getName() + ".jpeg"));
Log.d(" blob.getName()=", " " + blob.getName());
break;
} catch (URISyntaxException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (StorageException e) {
e.printStackTrace();
}
}
}
return null;
}
}
public void下载附件(){
试一试{
最终字符串storageConnectionString=“DefaultEndpointsProtocol=http;“+”AccountName=您的帐户名;“+”AccountKey=您的帐户密钥”;
//从连接字符串中检索存储帐户。
CloudStorageAccount-storageAccount=CloudStorageAccount.parse(storageConnectionString);
//创建blob客户端。
CloudBlobClient blobClient=storageAccount.createCloudBlobClient();
//获取对容器的引用。
//容器名称必须为小写
container=blobClient.getContainerReference(“容器名称”);
if(container.listBlobs()!=null){
Log.d(“在if中”,“列出conatin值”);
新的下载附件().execute();
}否则{
Log.d(“在else中”,“列表不包含任何值”);
}
}捕获(例外e){
//输出堆栈跟踪。
e、 printStackTrace();
}
}
公共类下载附件扩展异步任务{
@凌驾
受保护的Void doInBackground(Void…参数){
Log.d(“in-if”,“container.listBlobs();”+container.listBlobs());
Iterable valuesofconatiner=container.listBlobs();
Log.d(“在if中”,“valuesofconainer=“+valuesofconainer”);
对于(ListBlobItem blobItem:container.listBlobs()){
//如果项目是blob,而不是虚拟目录。
if(CloudBlob的blobItem实例){
//下载项目并将其保存到同名文件中。
CloudBlob blob=(CloudBlob)blobItem;
试一试{
下载(新的FileOutputStream(“您的存储位置”+blob.getName()+”.jpeg”);
Log.d(“blob.getName()=”,“”+blob.getName());
打破
}捕获(URISyntaxException e){
e、 printStackTrace();
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(存储异常){
e、 printStackTrace();
}
}
}
返回null;
}
}
您使用的是哪个版本的Java SDK?RESTAPI中的XML结构发生了一些变化。希望确保您没有使用较旧版本的SDK获取Blob列表。我正在使用jdk 1.7版本并下载最新版本的jar:microsoft-windowsazure-storage-SDK-0.7.0(之前我使用的是0.5.0版本),现在我可以按预期通过java代码从Azure服务器下载。非常感谢icedtrees和所有有价值的解决方案。。。。。