我有一些代碼用于在 AWS S3 存盤桶上創建檔案。當我使用檔案流時,它作業正常并且所有資料都存在。當我使用記憶體流時,檔案中的一些 xml 資料丟失了。這是我正在運行的代碼:
internal void WriteDataContractToFile(object data, string filename)
{
string path = @"C:\Jenova\restfulengine\RESTfulEngine\App_Data\requests\" filename;
try
{
using (FileStream stream = new FileStream(path, FileMode.Create, FileAccess.ReadWrite))
{
using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(stream, Encoding.UTF8))
{
DataContractSerializer dcs = new DataContractSerializer(data.GetType());
writer.WriteStartDocument();
dcs.WriteObject(writer, data);
}
}
var uploadRequest = new TransferUtilityUploadRequest();
uploadRequest.FilePath = path;
uploadRequest.Key = filename;
uploadRequest.BucketName = bucketName;
transferUtility.Upload(uploadRequest);
//METHOD WITH MEMORY STREAM THAT DOESNT WORK
using (MemoryStream stream = new MemoryStream())
{
using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(stream, Encoding.UTF8))
{
DataContractSerializer dcs = new DataContractSerializer(data.GetType());
writer.WriteStartDocument();
dcs.WriteObject(writer, data);
var uploadRequest1 = new TransferUtilityUploadRequest();
uploadRequest1.InputStream = stream;
uploadRequest1.Key = filename;
uploadRequest1.BucketName = bucketName;
transferUtility.Upload(uploadRequest);
}
}
}
}
當我對檔案流使用第一種方法時,所有資料都存在于我在 S3 中創建的檔案中。當我使用記憶體流時,我錯過了檔案的結尾:

并且缺少檔案的結尾:

這應該是這樣的:

有沒有人看到我做錯了什么?為什么記憶體流截斷資料對我來說沒有意義。即使我將該記憶體流寫入本地檔案以測驗資料也不完整,所以我有點不知所措,任何建議表示贊賞!
uj5u.com熱心網友回復:
您在流完全寫入之前上傳。當您處置撰寫器時,可能會寫入最后一個緩沖區。
所以:
using (MemoryStream stream = new MemoryStream())
{
using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(stream, Encoding.UTF8))
{
DataContractSerializer dcs = new DataContractSerializer(data.GetType());
writer.WriteStartDocument();
dcs.WriteObject(writer, data);
}
var uploadRequest1 = new TransferUtilityUploadRequest();
uploadRequest1.InputStream = stream;
uploadRequest1.Key = filename;
uploadRequest1.BucketName = bucketName;
transferUtility.Upload(uploadRequest);
}
使用XmlDictionaryWriter.CreateTextWriter(Stream, Encoding, Boolean)withfalse作為最后一個引數,讓它保持流打開。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/360735.html
標籤:C# 亚马逊-s3 aws-sdk-net
