2013-09-27 54 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