如何使用Java将映像从Azure存储帐户复制到ARM存储帐户?

问题描述:

我想通过使用Java将现有的自定义映像从Azure经典存储帐户复制到Azure ARM存储帐户。 (使用Java编程azCopy试行)如何使用Java将映像从Azure存储帐户复制到ARM存储帐户?

这听起来像你想实现以下使用Java编程azCopy cmdlet的。

斑点:Copy single blob across Storage accounts

AzCopy /来源:https://sourceaccount.blob.core.windows.net/mycontainer1 /目的地:https://destaccount.blob.core.windows.net/mycontainer2/SourceKey:KEY1/DestKey:键2 /Pattern:abc.txt

作为参考,这是我的使用Java编程实现上述cmdlet的代码示例,这取决于Azure Storage Client SDK for Java

复制的关键方法是CloudBlob.startCopy

import java.net.URI; 
import java.net.URISyntaxException; 
import java.security.InvalidKeyException; 
import java.util.HashMap; 
import java.util.Map; 

import com.microsoft.azure.storage.StorageCredentials; 
import com.microsoft.azure.storage.StorageException; 
import com.microsoft.azure.storage.StorageUri; 
import com.microsoft.azure.storage.blob.CloudBlob; 
import com.microsoft.azure.storage.blob.CloudBlockBlob; 

public class AzCopySample { 

    private static final String STORAGE_CONNECTION_STRING_TEMPLATE = "DefaultEndpointsProtocol=https;AccountName=%s;AccountKey=%s;"; 

    public static CloudBlob genBlobReference(Map<String, String> cmdOptions, String option) throws URISyntaxException, InvalidKeyException, StorageException { 
     URI uri = new URI(cmdOptions.get(option)); 
     String host = uri.getHost(); 
     String account = host.substring(0, host.indexOf(".")); 
     String key = cmdOptions.get(option+"Key"); 
     String connectionString = String.format(STORAGE_CONNECTION_STRING_TEMPLATE, account, key); 
     StorageCredentials credentials = StorageCredentials.tryParseCredentials(connectionString); 
     StorageUri storageUri = new StorageUri(uri); 
     CloudBlob blob = new CloudBlockBlob(storageUri, credentials); 
     return blob; 
    } 

    public static void main(String[] args) throws URISyntaxException, InvalidKeyException, StorageException { 
     String command = "AzCopy /Source:https://sourceaccount.blob.core.windows.net/mycontainer1 /Dest:https://destaccount.blob.core.windows.net/mycontainer2 /SourceKey:key1 /DestKey:key2 /Pattern:abc.txt"; 
     String[] cmdItems = command.split(" "); 
     Map<String, String> cmdOptions = new HashMap<>(); 
     for(int i = 1; i < cmdItems.length; i++) { 
      String cmdItem = cmdItems[i]; 
      int index = cmdItem.indexOf(":"); 
      String key = cmdItem.substring(0, index); 
      String value = cmdItem.substring(index+1); 
      cmdOptions.put(key, value); 
     } 
     CloudBlob source = genBlobReference(cmdOptions, "/Source"); 
     CloudBlob dest = genBlobReference(cmdOptions, "/Dest"); 
     dest.startCopy(source.getUri()); 
    } 

} 
+0

嗨,彼得,非常感谢您的帮助。但我挣扎着错误“线程中的异常”主“com.microsoft.azure.storage.StorageException:服务器未能验证请求。请确保授权标头的值包括签名正确形成。”你可以帮我吗 ? – CodeFunda

+0

其他给我代码复制经典存储图像到ARM存储.... – CodeFunda