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

时间:2017-05-21 16:27:04

标签: c# azure uwp azure-storage azure-storage-blobs

我花了几天时间尝试使用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存储实验是关于直接上传文件本身但是导致了同样的问题所以我尝试了一种不同的方法(流读/写),认为一个人对我想要的东西不起作用做。现在我正在使用流方法(除非有人提出其他建议,否则会坚持使用)但是对于云连接部分(以及一般的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);

    }
}

1 个答案:

答案 0 :(得分:2)

根据您的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

<强> RESULT

enter image description here

我注意到你在DatabaseHelper构造函数中调用了异步方法,我认为如果你的容器不存在会有一些风险。此外,您可以使用Microsoft Azure Storage Explorer将txt文件直接上传到azure blob,以便隔离此问题。此外,还有一个关于operate Azure blob storage in UWP apps的示例,您可以参考它。