webapi プロジェクトに画像をアップロードする Task メソッドがあります。すべて正常に動作しますが、AWS クラウド プロセスへのアップロードを別のタスク/スレッドで実行し、そのプロセスが完了した後に何らかの機能を実行したいと考えています。要約すると、これが私が完成させようとしているものです。
- http リクエストは、写真またはビデオとともに API に入ります
- いくつかの検証が行われ、クラウドのアップロードを開始する新しいスレッドが開始されます
最初のリクエストを 200 またはある種の OK ステータスで終了します
最初のリクエストが終了している間、アップロードが進行中であり、それが終了すると、何らかの完全な機能が実行されます。この関数でクライアントを更新する必要はありませんが、いくつかのデータを保存する必要があります。
助けてくれてありがとう
public async Task<HttpResponseMessage> PostMedia([FromUri]string userId, [FromUri]string eventId,[FromUri]string city,
[FromUri]string title)
{
// Check if the request contains multipart/form-data.
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
//temp directory
string root = HttpContext.Current.Server.MapPath("~/App_Data");
var provider = new MultipartFormDataStreamProvider(root);
try
{
var sb = new StringBuilder(); // Holds the response body
// Read the form data and return an async task.
await Request.Content.ReadAsMultipartAsync(provider);
// This illustrates how to get the form data.
foreach (var key in provider.FormData.AllKeys)
{
foreach (var val in provider.FormData.GetValues(key))
{
sb.Append(string.Format("{0}: {1}\n", key, val));
}
}
// This illustrates how to get the file names for uploaded files.
foreach (var file in provider.FileData)
{
//Needs to kick off new task/thread
using (
var client = AWSClientFactory.CreateAmazonS3Client("key",
"key"))
{
var fileInfo = new FileInfo(file.LocalFileName);
using (var stream = fileInfo.Open(FileMode.Open))
{
var request = new PutObjectRequest();
request.WithBucketName("Images")
.WithCannedACL(S3CannedACL.PublicRead)
.WithKey(ConfigurationManager.AppSettings["ImageBucket"] + fileInfo.Name +
file.Headers.ContentDisposition.FileName.Substring(file.Headers.ContentDisposition.FileName.LastIndexOf('.')).Replace("\"", ""))
.InputStream = stream;
client.PutObject(request);
sb.Append(string.Format("Uploaded file: {0} ({1} bytes)\n", fileInfo.Name, fileInfo.Length));
var mtype = MediaType.Picture;
if(file.Headers.ContentType.MediaType.StartsWith("image"))
{
mtype = MediaType.Picture;
}
else if(file.Headers.ContentType.MediaType.StartsWith("video"))
{
mtype = MediaType.Video;
}
if (File.Exists(fileInfo.FullName))
{
File.Delete(fileInfo.FullName);
}
}
}
}
return new HttpResponseMessage()
{
StatusCode = HttpStatusCode.Created,
Content = new StringContent(sb.ToString())
};
}
catch (System.Exception e)
{
return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
}
}