読者です 読者をやめる 読者になる 読者になる

割と普通なブログ

Microsoft Azure や ASP.NET、Java EE 系の話題を記載します

Windows Azure SDK for Java を利用して BLOB 上に content-type を変えてアップロードしてみる

Java 8 の話題が続いたが、お次は Windows Azure SDK for Java についての TIPS を記載する。ご存じの方も多いと思うが、Windows Azure SDK for JavaGithub/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 で動作している