電話からの 1 つ以上のファイルのアップロードをサポートする Windows Phone 8.1 (WinRT) アプリを作成しました。
これにはバックグラウンド アップローダーを使用します。次の関数を使用してバックグラウンドアップロードを作成します
public async void AddUploads(IReadOnlyList<StorageFile> uploadFiles)
{
BackgroundTransferGroup group = BackgroundTransferGroup.CreateGroup(this.GroupId);
group.TransferBehavior = BackgroundTransferBehavior.Serialized;
// BackgroundUploader automatically sets Content-Type header to multipart/related
BackgroundUploader uploader = new BackgroundUploader();
uploader.TransferGroup = group;
uploader.SetRequestHeader("Authorization", "Bearer " + this.AccessToken);
uploader.Method = "POST";
foreach (StorageFile file in uploadFiles)
{
UploadOperation upload = await uploader.CreateUploadAsync(new Uri(this.uploadUri, UriKind.Absolute), GetTransferContents(file), "related");
Progress<UploadOperation> progressCallback = new Progress<UploadOperation>(UploadProgressNotification);
// Will this exception be caught??
try
{
upload.StartAsync().AsTask(this.CancelToken, progressCallback);
}
}
}
コールバックに従って進行状況の UI を更新します
public void UploadProgressNotification(UploadOperation upload)
{
var ignore = Window.Current.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
var uploadProgress = upload.Progress;
Progress = (uploadProgress.BytesSent + uploadProgress.BytesReceived) * 100.0 / (uploadProgress.TotalBytesToSend + uploadProgress.TotalBytesToReceive);
switch(uploadProgress.Status)
{
case BackgroundTransferStatus.Canceled:
Status = "Canceled";
break;
case BackgroundTransferStatus.Idle:
Status = "Waiting";
break;
case BackgroundTransferStatus.PausedNoNetwork:
Status = "Waiting for network";
break;
case BackgroundTransferStatus.Running:
Status = "Uploading";
break;
case BackgroundTransferStatus.Error:
Status = "Failed";
System.Diagnostics.Debug.WriteLine(upload.GetResponseInformation().StatusCode);
var headers = upload.GetResponseInformation().Headers;
foreach(string key in headers.Keys)
{
System.Diagnostics.Debug.WriteLine(headers[key]);
}
System.Diagnostics.Debug.WriteLine(upload.GetResponseInformation().IsResumable);
break;
case BackgroundTransferStatus.Completed:
Status = "Completed";
break;
default:
Status = "Waiting";
break;
}
UploadStatus = uploadProgress.Status;
});
}
ただし、ファイルがサーバーに正常にアップロードされ、進行状況が 100% であっても、ほとんどの場合、UploadOperation のステータスは「実行中」から「完了」に変わりません。複数のファイルをアップロードすると、ステータスが「完了」と表示されるものと「実行中」と表示されるものがありますが、すべて正常にアップロードされています。
ファイルが完全にアップロードされたことを確認するにはどうすればよいですか?