C# 使用BackgroundUploader将视频文件上载到服务器

C# 使用BackgroundUploader将视频文件上载到服务器,c#,windows-8,upload,windows-store-apps,background-transfer,C#,Windows 8,Upload,Windows Store Apps,Background Transfer,我正在创建面向Windows 8.0的Windows应用商店应用程序 我的电脑上安装了Windows 8.1预览版,我使用VS2012创建了应用程序,并使用以下代码和方法将文件上载到服务器- string url = //url to upload videostring boundray = string.Format("abcboundry"); String header = string.Format("--{0}\r\nContent-Disposition: form-data; n

我正在创建面向Windows 8.0的Windows应用商店应用程序 我的电脑上安装了Windows 8.1预览版,我使用VS2012创建了应用程序,并使用以下代码和方法将文件上载到服务器-

string url = //url to upload videostring boundray = string.Format("abcboundry");
String header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\"\r\n" + "Content-Type: {3}\r\n\r\n", boundray, "file", source.Name, "application/octet-stream");
string footer = string.Format("\r\n--{0}--\r\n", boundray);

Stream headerStream = GenerateStreamFromString(header);
Stream footerStream = GenerateStreamFromString(footer);
//Stream dataStream = iRandomstream.AsStream();
Stream dataStream = await source.OpenStreamForReadAsync();

MemoryStream fileDataStream = new MemoryStream();
await headerStream.CopyToAsync(fileDataStream);
await dataStream.CopyToAsync(fileDataStream);
await footerStream.CopyToAsync(fileDataStream);
fileDataStream.Position = 0;

IInputStream stream = fileDataStream.AsInputStream();

BackgroundUploader backgroundUploader = new BackgroundUploader();
backgroundUploader.SetRequestHeader("Content-Type", "multipart/form-data; boundary=" + boundray);
backgroundUploader.Method = "POST";

UploadOperation uploadOpration = await backgroundUploader.CreateUploadFromStreamAsync(new Uri(url), stream);

await HandleUploadAsync(uploadOpration, true);
它对我来说工作正常,但当在安装了Windows 8.0的其他系统上进行测试时,由于AccessViolationException而导致应用程序崩溃,该测试未得到处理。试图读取或写入受保护的内存。这通常表示其他内存已损坏。”在InitializeComponent.error处

现在,我尝试implement进行多部分上传,但这段代码没有成功-

List<BackgroundTransferContentPart> parts = new List<BackgroundTransferContentPart>();
BackgroundTransferContentPart part = new BackgroundTransferContentPart("file", source.Name);
part.SetHeader("Content-Type", "application/octet-stream");
part.SetFile(source);
parts.Add(part);

BackgroundUploader uploader = new BackgroundUploader();
uploader.Method = "POST";
UploadOperation uploadOp = await uploader.CreateUploadAsync(new Uri(url), parts, "form-data",boundray);

await HandleUploadAsync(uploadOp, true);
List parts=new List();
BackgroundTransferContentPart=新的BackgroundTransferContentPart(“文件”,source.Name);
SetHeader部分(“内容类型”、“应用程序/八位字节流”);
SetFile部分(源文件);
部分。添加(部分);
BackgroundUploader uploader=新的BackgroundUploader();
uploader.Method=“POST”;
UploadOperation uploadOp=Wait uploader.CreateUploadAsync(新Uri(url),部分,“表单数据”,boundray);
等待HandleUploadAsync(上传,true);
我能做些什么来解决我的问题


如何将大文件上载到服务器?

您是否尝试过使用WinRT流来代替
System.Net.MemoryStream
,请尝试。您可以使用
RandomAccessStream.CopySync()
来填充它。

您是否尝试过使用WinRT流来代替
System.Net.MemoryStream
,尝试一下。您可以使用
RandomAccessStream.CopySync()
来填充它。

我解决了我的问题

  • 在LocalFolder中创建一个临时原始文件并写入我们需要上传到文件的流(流包含页眉和页脚)
  • 将新创建的临时文件同步到存储文件
  • 从存储文件中获取输入流
  • 现在使用此流和用于创建流的相同边界创建上载

    StorageFile VideoFileStream = await ApplicationData.Current.LocalFolder.CreateFileAsync("tempStream", CreationCollisionOption.OpenIfExists);
    var fs2 = await VideoFileStream.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite);
    IInputStream aaaa= fs2.GetInputStreamAt(0);
    
    BackgroundUploader backgroundUploader = new BackgroundUploader();
    backgroundUploader.SetRequestHeader("Content-Type", "multipart/form-data; boundary=" + boundray);
    backgroundUploader.Method = "POST";
    
    UploadOperation uploadOpration = await backgroundUploader.CreateUploadFromStreamAsync(new Uri(url),aaaa);
    await HandleUploadAsync(uploadOpration, true);
    
  • 我解决了我的问题

  • 在LocalFolder中创建一个临时原始文件并写入我们需要上传到文件的流(流包含页眉和页脚)
  • 将新创建的临时文件同步到存储文件
  • 从存储文件中获取输入流
  • 现在使用此流和用于创建流的相同边界创建上载

    StorageFile VideoFileStream = await ApplicationData.Current.LocalFolder.CreateFileAsync("tempStream", CreationCollisionOption.OpenIfExists);
    var fs2 = await VideoFileStream.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite);
    IInputStream aaaa= fs2.GetInputStreamAt(0);
    
    BackgroundUploader backgroundUploader = new BackgroundUploader();
    backgroundUploader.SetRequestHeader("Content-Type", "multipart/form-data; boundary=" + boundray);
    backgroundUploader.Method = "POST";
    
    UploadOperation uploadOpration = await backgroundUploader.CreateUploadFromStreamAsync(new Uri(url),aaaa);
    await HandleUploadAsync(uploadOpration, true);
    

  • 当它在8.0中运行时,使用远程调试器和测试从8.1对其进行调试,并查看失败点。我知道这是UploadOperation UploadOperation=Wait backgroundUploader.CreateUploadFromStreamAsync(新Uri(url),stream);在8.0中创建Access voilation的行在8.0中运行时,使用远程调试器和测试从8.1对其进行调试,并查看失败点。我知道这是UploadOperation UploadOperation=Wait backgroundUploader.CreateUploadFromStreamAsync(新Uri(url),stream);在8.0中创建Access voilation的行是的,我刚刚创建了-InMemoryRandomAccessStream iras=new InMemoryRandomAccessStream();并通过wait iras.WriteAsync(headerBuffer);方法在对象中写入数据\n headerbuffer->video buffer->footerBuffer它现在没有抛出AccessMemoryFoilation异常,但上载没有成功。是的,我刚刚做到了-InMemoryRandomAccessStream iras=new InMemoryRandomAccessStream();通过等待iras.WriteAsync(headerbuffer);方法在对象中写入数据\n headerbuffer->video buffer->footerbufferIts现在未引发AccessMemoryFoilation异常,但上载未成功。