【问题标题】:Upload video file to server with BackgroundUploader使用 BackgroundUploader 将视频文件上传到服务器
【发布时间】:2013-10-03 16:08:36
【问题描述】:

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

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. 错误

现在我尝试使用 BackgroundTransferContentPart 进行分段上传,但这段代码没有成功 -

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

我可以做些什么来解决我的问题?

如何上传大文件到服务器?

【问题讨论】:

  • 当它在 8.0 中运行时,使用远程调试器和测试从 8.1 调试它,看看它在哪一点失败。
  • 我知道是 UploadOperation uploadOperation = await backgroundUploader.CreateUploadFromStreamAsync(new Uri(url), stream);在 8.0 中创建 Access voilation 的行

标签: c# windows-8 upload windows-store-apps background-transfer


【解决方案1】:

我解决了我的问题。

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

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

【讨论】:

    【解决方案2】:

    您是否尝试过改用 WinRT 流?而不是System.Net.MemoryStream,请尝试Windows.Storage.Streams.InMemoryRandomStream。你可以使用RandomAccessStream.CopyAsync()来填写。

    【讨论】:

    • 是的,我刚刚做了 - InMemoryRandomAccessStream iras = new InMemoryRandomAccessStream();并通过 await iras.WriteAsync(headerBuffer);方法在对象中写入数据\n headerbuffer->video buffer->footerbuffer
    • 它现在给出不抛出 AccessMemoryVoilation 异常但上传没有成功。
    猜你喜欢
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多