移动到 blob 存储后文件内容被重写

File contents being rewritten after moving to blob storage

过去几天我一直在试验 Azure blob 存储,尝试为我的 UWP 应用程序构建一个云数据库。

我设法获得了将文件上传到 Azure 存储的功能,但文件的内容被替换为我想称之为垃圾的内容,但我确信它有一种模式表明我做错了什么。

我要上传的文件是简单的 .txt 文件,信息行由字符分隔。

.txt 文件的内容格式应如下所示:

:SKU|:brand|:brand |:Train smarter and go farther with the brand, a product designed to help you reach your peak performance.|:249.95|:|:|:|:|:|:|:https://link.com|

:SKU|:brand|:brand Bluetooth Speaker |:Get up to 87 hours of great-sounding wireless music with the brand Bluetooth Speaker .|:269.00|:|:|:|:|:|:|:https://link.com|

:SKU|:brand|:brand Docking Station - USB 3.0 |:This USB 3.0 brand docking station connects  up to three additional monitors, external devices, and the Internet .|:169.99|:|:|:|:|:|:|:https://link.com|

但是在上传到我的 blob 存储之后,内容看起来像这样:

:SKU|:|:-//W3C//DTD XHTML 1.0 Strict//EN|://DTD XHTML 1.0 Strict//EN|:/W3C//DTD XHTML 1.0 Strict//EN|:|:|:|:|:|:|:-//W3C//DTD XHTML 1.0 Strict//EN|

:SKU|:|:-//W3C//DTD XHTML 1.0 Strict//EN|://DTD XHTML 1.0 Strict//EN|:/W3C//DTD XHTML 1.0 Strict//EN|:|:|:|:|:|:|:-//W3C//DTD XHTML 1.0 Strict//EN|

:SKU|:|:-//W3C//DTD XHTML 1.0 Strict//EN|://DTD XHTML 1.0 Strict//EN|:/W3C//DTD XHTML 1.0 Strict//EN|:|:|:|:|:|:|:-//W3C//DTD XHTML 1.0 Strict//EN|

:SKU|:|:-//W3C//DTD XHTML 1.0 Strict//EN|://DTD XHTML 1.0 Strict//EN|:/W3C//DTD XHTML 1.0 Strict//EN|:|:|:|:|:|:|:-//W3C//DTD XHTML 1.0 Strict//EN|

:SKU|:|:-//W3C//DTD XHTML 1.0 Strict//EN|://DTD XHTML 1.0 Strict//EN|:/W3C//DTD XHTML 1.0 Strict//EN|:|:|:|:|:|:|:-//W3C//DTD XHTML 1.0 Strict//EN|

:SKU|:brand|:brand 1TB Hard Drive for Laptops|:Upgrade your laptop to a  1 TB of storage with a high quality, reliable brand hard drive.|:68.85|:|:|:|:|:|:|:https://link.com|

我的第一个 blob 存储实验是关于直接上传文件本身,但这导致了同样的问题,所以我尝试了一种不同的方法(流 reading/writing),认为这个方法对我来说不起作用试图做。现在我正在使用流方法(除非有人有其他建议,否则我会坚持使用)但是对于云连接部分(以及一般的 UWP)来说,我是如此陌生,我不知道我可能做错了什么。

这是我用来上传到我的 blob 存储的代码:

public class DatabaseHelper
{
    CloudBlockBlob blobb;

    public DatabaseHelper()
    {

        StorageCredentials credentials = new StorageCredentials("nameommited", "key ommitted");
        CloudStorageAccount storageAccount = new CloudStorageAccount(credentials, true);
        var blobClient = storageAccount.CreateCloudBlobClient();
        var container = blobClient.GetContainerReference("testcontainer");
        container.CreateIfNotExistsAsync();

        CloudBlockBlob blob = container.GetBlockBlobReference("testfile.txt");
        blob.DeleteIfExistsAsync();
        blobb = blob;
    }

    public async void UploadFile(StorageFile fileToUpload)
    {

        var fileStream = await fileToUpload.OpenAsync(FileAccessMode.Read);
        ulong size = fileStream.Size;

        // Get a data stream from somewhere.
        Stream inputStream = fileStream.AsStream(); ;
       await blobb.UploadFromStreamAsync(inputStream);

    }
}

基于您的 DatabaseHelper,我构建了我的应用程序来测试这个问题,如下所示:

private async void btnUploadFile_Click(object sender, RoutedEventArgs e)
{
    var picker = new Windows.Storage.Pickers.FileOpenPicker();
    picker.ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail;
    picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.Desktop;
    picker.FileTypeFilter.Add(".txt");

    Windows.Storage.StorageFile file = await picker.PickSingleFileAsync();
    if (file != null)
    {
        var fileHelper = new DatabaseHelper();
        await fileHelper.UploadFile(file);
    }
}

这是我测试的txt文件,你可以参考test.txt

结果

我注意到您在 DatabaseHelper 构造函数中调用了 async 方法,我认为如果您的容器不存在会有一些风险。另外,你可以用Microsoft Azure Storage Explorer for uploading your txt file directly to azure blob, in order to isolate this issue. Also, there is a sample about operate Azure blob storage in UWP apps,你可以参考一下