Java 8 の話題が続いたが、お次は Windows Azure SDK for Java についての TIPS を記載する。ご存じの方も多いと思うが、Windows Azure SDK for Java は Github/azure-sdk-for-java の様に GitHub にて公開されている。
GitHub のトップページに記載されているサンプルコードを利用することでファイルのアップロードは可能だが、画像ファイルや動画ファイルをアップロードする場合、別途 content-type を明示的に指定しないとブラウザが正しく動作しない場合がある(画像ファイルなのにダウンロードしようとするとか)。
以下に、BLOB への画像データアップロード時に content-type を image/jpeg に設定するサンプルコードを記載した。何も指定しない場合、content-type は application/octet-stream としてアップロードされる点に注意してほしい*1。
package org.mydomain.sample; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.URISyntaxException; import java.security.InvalidKeyException; import com.microsoft.windowsazure.services.blob.client.BlobContainerPermissions; import com.microsoft.windowsazure.services.blob.client.BlobContainerPublicAccessType; import com.microsoft.windowsazure.services.blob.client.BlobProperties; import com.microsoft.windowsazure.services.blob.client.CloudBlobClient; import com.microsoft.windowsazure.services.blob.client.CloudBlobContainer; import com.microsoft.windowsazure.services.blob.client.CloudBlockBlob; import com.microsoft.windowsazure.services.core.storage.CloudStorageAccount; import com.microsoft.windowsazure.services.core.storage.StorageException; public class Main { public static final String storageConnectionString = "DefaultEndpointsProtocol=https;" + "AccountName=your_account_name;"+ "AccountKey=your_account_key"; public static void main(String[] args) { try { CloudStorageAccount account; CloudBlobClient serviceClient; CloudBlobContainer container; CloudBlockBlob blob; account = CloudStorageAccount.parse(storageConnectionString); serviceClient = account.createCloudBlobClient(); // コンテナ名を設定し、存在しない場合は作成 container = serviceClient.getContainerReference("blobsample"); container.createIfNotExist(); // コンテナレベルでアクセスを設定 BlobContainerPermissions containerPermissions; containerPermissions = new BlobContainerPermissions(); containerPermissions .setPublicAccess(BlobContainerPublicAccessType.CONTAINER); container.uploadPermissions(containerPermissions); // ブロブの作成 blob = container.getBlockBlobReference("image1.jpg"); File fileReference = new File("c:\\temp\\image1.jpg"); // ブロブのアップロード blob.upload(new FileInputStream(fileReference), fileReference.length()); // content-type の設定。ブロブのアップロード後に実施しないとダメ BlobProperties properties = blob.getProperties(); properties.setContentType("image/jpeg"); blob.uploadProperties(); System.out.println(blob.getUri()); } catch (StorageException | URISyntaxException | InvalidKeyException | IOException exception) { System.out.print("One Exception encountered: "); exception.printStackTrace(); System.exit(-1); } System.out.println("end"); } }
上記にコードにて、BLOBのアップロード後に content-type を設定している点に注意してほしい(BLOBのアップロード後でないと blob.getProperties() でこける)。
出力結果は以下となる。
https://<your_account_name>.blob.core.windows.net/blobsample/image1.jpg end
*1:ちなみに、今回のサンプルは JDK8 で動作している