メトロ アプリのバックグラウンド転送 (アップローダー) の進行状況は、以下に示すように、1 秒以内に 1 MB を超えるファイルに対して 100% を示しています。
*Running: c5593753-d155-425a-8e25-6b1f90bbff85
Progress: c5593753-d155-425a-8e25-6b1f90bbff85, Status: Running
- Sent bytes: 131072 of 1310245 (10%), Received bytes: 0 of 0
Progress: c5593753-d155-425a-8e25-6b1f90bbff85, Status: Running
- Sent bytes: 1310245 of 1310245 (100%), Received bytes: 0 of 0*
したがって、私の進行状況バーにも 100% が表示されますが、これはもちろん間違っています。しばらくすると、アップロードが完了し、次のようになります。
*Progress: c5593753-d155-425a-8e25-6b1f90bbff85, Status: Completed
- Sent bytes: 1310245 of 1310245 (100%), Received bytes: 49 of 49
Completed: c5593753-d155-425a-8e25-6b1f90bbff85, Status Code: 200
- Response updated; Header count: 9*
したがって、ある意味ではアップローダは機能していますが、この間違った原因により、実際にはファイルは 100% 完了していません。10 MB のファイルをテストしましたが、問題は同じままです。 3分後に来てください。
http://code.msdn.microsoft.com/windowsapps/Background-Transfer-Sample-d7833f61で提供されているものと同じアップロード サンプルを使用しています。
私が使用したコードは次のとおりです。
private async void StartUpload_Click(object sender, RoutedEventArgs e)
{
if (ApplicationView.Value == ApplicationViewState.Snapped && !ApplicationView.TryUnsnap())
{
rootPage.NotifyUser("File picker cannot be opened in snapped mode. Please unsnap first.", NotifyType.ErrorMessage);
return;
}
FileOpenPicker picker = new FileOpenPicker();
picker.FileTypeFilter.Add("*");
StorageFile file = await picker.PickSingleFileAsync();
Uri uri;
string uploadFileURl = "https://dummy.com/Link1/Link2";
if (!Uri.TryCreate(uploadFileURl, UriKind.RelativeOrAbsolute, out uri))
{
rootPage.NotifyUser("Invalid URI.", NotifyType.ErrorMessage);
return;
}
if (file == null)
{
rootPage.NotifyUser("No file selected.", NotifyType.ErrorMessage);
return;
}
BackgroundUploader uploader = new BackgroundUploader();
uploader.Method = "POST";
uploader.SetRequestHeader("uid", "1@test.com");
uploader.SetRequestHeader("pwd","test");
uploader.SetRequestHeader("file_name", file.Name);
uploader.SetRequestHeader("p", "/");
//just hard coding the particular file size for sample here
Int64 size = 221390;
uploader.SetRequestHeader("file_size", size.ToString());
UploadOperation upload = uploader.CreateUpload(uri, file);
// Attach progress and completion handlers.
await HandleUploadAsync(upload, true);
}
private async Task HandleUploadAsync(UploadOperation upload, bool start)
{
try
{
LogStatus("Running: " + upload.Guid, NotifyType.StatusMessage);
Progress<UploadOperation> progressCallback = new Progress<UploadOperation>(UploadProgress);
if (start)
{
// Start the upload and attach a progress handler.
await upload.StartAsync().AsTask(cts.Token,progressCallback);
}
else
{
// The upload was already running when the application started, re-attach the progress handler.
await upload.AttachAsync().AsTask(cts.Token, progressCallback);
}
ResponseInformation response = upload.GetResponseInformation();
LogStatus(String.Format("Completed: {0}, Status Code: {1}", upload.Guid, response.StatusCode),
NotifyType.StatusMessage);
}
catch (TaskCanceledException)
{
LogStatus("Canceled: " + upload.Guid, NotifyType.StatusMessage);
}
catch (Exception ex)
{
throw;
}
}
private void UploadProgress(UploadOperation upload)
{
MarshalLog(String.Format("Progress: {0}, Status: {1}", upload.Guid, upload.Progress.Status));
BackgroundUploadProgress progress = upload.Progress;
double percentSent = 100;
if (progress.TotalBytesToSend > 0)
{
percentSent = progress.BytesSent * 100 / progress.TotalBytesToSend;
}
//MarshalLog(String.Format(" - Sent bytes: {0} of {1} ({2}%)",
// progress.BytesSent, progress.TotalBytesToSend, percentSent));
MarshalLog(String.Format(" - Sent bytes: {0} of {1} ({2}%), Received bytes: {3} of {4}",
progress.BytesSent, progress.TotalBytesToSend, percentSent,
progress.BytesReceived, progress.TotalBytesToReceive));
if (progress.HasRestarted)
{
MarshalLog(" - Upload restarted");
}
if (progress.HasResponseChanged)
{
// We've received new response headers from the server.
MarshalLog(" - Response updated; Header count: " + upload.GetResponseInformation().Headers.Count);
// If you want to stream the response data this is a good time to start.
// upload.GetResultStreamAt(0);
}
}