2013-09-27 51 views
1

我创建Windows商店应用靶向的Windows 8.0
我的Windows 8.1预览安装在我的电脑上,我创建了VS2012应用程序,并实现文件上传到服务器BackgroundUploadercreateUploadFromStreamAsync方法与休耕码 -上传视频文件到服务器BackgroundUploader

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

现在我试图implenent 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); 

我能做些什么解决我的问题?

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

+0

使用远程调试和测试,当它在8.0上运行,从8.1调试它,并期待笏哪一点呢失败。 – magicandre1981

+0

我知道它是UploadOperation uploadOpration = await backgroundUploader.CreateUploadFromStreamAsync(new Uri(url),stream);在8.0中创建Access voilation的行 – Abhishek

回答

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

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

+0

是的,我只是做了 - InMemoryRandomAccessStream iras = new InMemoryRandomAccessStream();并等待iras.WriteAsync(headerBuffer);方法在对象中写入数据\ n headerbuffer-> video buffer-> footerbuffer – Abhishek

+0

它现在给予不抛出AccessMemoryVoilation异常但上传不成功。 – Abhishek