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;
}
}

}

参考:

→JPGのダウンロード

コメント

このブログの人気の投稿

ソリューション構成ごとにconfigファイルを作成する

C++の古いプロジェクトのビルドでerror MIDL2311 : statements outside library block are illegal in mktyplib compatability mode

web.config debug/releaseの内容を変換構文を使って切り替える