dotNet Core APIでS3ファイル(apk)をダウンロードする
AWS S3ライブラリーを使って、AWS S3のバケットからAPKファイルをダウンロードしたのでメモしておく。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Mime;
using System.Threading.Tasks;
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using Microsoft.AspNetCore.Mvc;
namespace WebApi.Controllers
{
[ApiController]
[Route("api/[controller]")]
// [Route("[controller]")]
public class S3Controller : ControllerBase
{
private const string bucketName = "hoge";
// private const string keyName = "hoge.jpg";
private const string keyName = "HelloWorld.apk";
// Specify your bucket region (an example region is shown).
private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USEast2;
private static IAmazonS3 client;
// APKをダウンロード
[HttpGet("apk")]
public async Task<IActionResult> GetApkFileAsync()
{
client = new AmazonS3Client(bucketRegion);
//string res = await ReadObjectDataAsync();
//System.Net.Mime.MediaTypeNames.Image newImage = System.Net.Mime.MediaTypeNames.Image.FromFile("SampImag.jpg");
//return File(file, System.Net.Mime.MediaTypeNames.Image.Jpeg, "sample.jpg");
// return Ok();
Stream apkStream = await ReadObjectDataAsync2();
Response.Headers.Add("Content-Disposition", new ContentDisposition
{
FileName = "HelloWorld.apk",
Inline = true // false = prompt the user for downloading; true = browser to try to show the file inline
}.ToString());
return File(apkStream, "application/octet-stream");
}
public async Task<Stream> ReadObjectDataAsync2()
{
try
{
GetObjectRequest request = new GetObjectRequest
{
BucketName = bucketName,
Key = keyName
};
using (var getObjectResponse = await client.GetObjectAsync(request))
{
using (var responseStream = getObjectResponse.ResponseStream)
{
var stream = new MemoryStream();
await responseStream.CopyToAsync(stream);
stream.Position = 0;
return stream;
}
}
}
catch (Exception exception)
{
throw new Exception("Read object operation failed.", exception);
}
}
private static async Task<string> ReadObjectDataAsync()
{
string responseBody = "";
try
{
GetObjectRequest request = new GetObjectRequest
{
BucketName = bucketName,
Key = keyName
};
using (GetObjectResponse response = await client.GetObjectAsync(request))
using (Stream responseStream = response.ResponseStream)
using (StreamReader reader = new StreamReader(responseStream))
{
string title = response.Metadata["x-amz-meta-title"]; // Assume you have "title" as medata added to the object.
string contentType = response.Headers["Content-Type"];
Console.WriteLine("Object metadata, Title: {0}", title);
Console.WriteLine("Content type: {0}", contentType);
responseBody = reader.ReadToEnd(); // Now you process the response body.
//file = System.Text.Encoding.ASCII.GetBytes(responseBody);
//file = System.Drawing.ImageConverter
}
return responseBody;
}
catch (AmazonS3Exception e)
{
// If bucket or object does not exist
Console.WriteLine("Error encountered ***. Message:'{0}' when reading object", e.Message);
throw e;
}
catch (Exception e)
{
Console.WriteLine("Unknown encountered on server. Message:'{0}' when reading object", e.Message);
throw e;
}
}
// JPGをダウンロード
[HttpGet("image")]
public async Task<IActionResult> GetImageFileAsync()
{
client = new AmazonS3Client(bucketRegion);
//string res = await ReadObjectDataAsync();
//System.Net.Mime.MediaTypeNames.Image newImage = System.Net.Mime.MediaTypeNames.Image.FromFile("SampImag.jpg");
//return File(file, System.Net.Mime.MediaTypeNames.Image.Jpeg, "sample.jpg");
// return Ok();
Stream imageStream = await ReadObjectDataJPG();
Response.Headers.Add("Content-Disposition", new ContentDisposition
{
FileName = "Image.jpg",
Inline = true // false = prompt the user for downloading; true = browser to try to show the file inline
}.ToString());
return File(imageStream, "image/jpeg");
}
public async Task<Stream> ReadObjectDataJPG()
{
try
{
GetObjectRequest request = new GetObjectRequest
{
BucketName = bucketName,
Key = keyName
};
using (var getObjectResponse = await client.GetObjectAsync(request))
{
using (var responseStream = getObjectResponse.ResponseStream)
{
var stream = new MemoryStream();
await responseStream.CopyToAsync(stream);
stream.Position = 0;
return stream;
}
}
}
catch (Exception exception)
{
throw new Exception("Read object operation failed.", exception);
}
}
[HttpGet]
public int GetTest()
{
int aa = 0;
return aa;
}
}
}
参考:
- Amazon Simple Storage Service endpoints and quotas
- MS開発者ガイドAWS SDK for .NET を使用したオブジェクトの取得
- Get an object Using the AWS SDK for .NET
- チュートリアル: ASP.NET Core で Web API を作成する
- C# MVC/API - Return an image from Amazon S3 for my API Call
→JPGのダウンロード
コメント
コメントを投稿