Загрузка фотопотока с камеры в лазурный блоб в WP7

У меня есть следующая простая страница приложения, которая использует камеру телефона для загрузки сделанной фотографии в лазурный блоб:

public partial class AddReport : PhoneApplicationPage
{
    // blobs stuff
    string storageAccount = "MYACCOUNT";
    string storageKey = "MYKEY";
    string blobServiceUri = "http://MYACCOUNT.blob.core.windows.net";
    CloudBlobClient blobClient;

    private Report newReport;
    public AddReport()
    {
        InitializeComponent();   
    }

    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        //base.OnNavigatedTo(e);

        newReport = new Report();
        var credentials = new StorageCredentialsAccountAndKey(storageAccount, storageKey);
        blobClient = new CloudBlobClient(blobServiceUri, credentials);
    }

    private void TakePhotoClick(object sender, EventArgs eventArgs)
    {
        //The camera chooser used to capture a picture.
        CameraCaptureTask ctask;

        //Create new instance of CameraCaptureClass
        ctask = new CameraCaptureTask();

        //Create new event handler for capturing a photo
        ctask.Completed += new EventHandler<PhotoResult>(ctask_Completed);

        //Show the camera.
        ctask.Show();

    }

    void ctask_Completed(object sender, PhotoResult e)
    {

        if (e.TaskResult == TaskResult.OK && e.ChosenPhoto != null)
        {

            WriteableBitmap CapturedImage = PictureDecoder.DecodeJpeg(e.ChosenPhoto);
            UploadToBlobContainer(e.ChosenPhoto);
        }
        else
        {
            //user decided not to take a picture
        }
    }
    private void UploadToBlobContainer(System.IO.Stream stream)
    {
        string containerName = "reportsPhotos";
        var container = blobClient.GetContainerReference(containerName);

        container.CreateIfNotExist(true, r =>
            Dispatcher.BeginInvoke(() =>
            {
                var blobName = "report" + newReport.ReportId.ToString();
                var blob = container.GetBlobReference(blobName);
                blob.Metadata["ReportId"] = newReport.ReportId.ToString();
                blob.UploadFromStream(stream, r2 =>
                    Dispatcher.BeginInvoke(() =>
                    {
                         newReport.Photo = container.Uri + "/" + blobName;
                    }));
            }));

    }
}

Это простой случай, и я не использую SAS для аутентификации, вместо этого я сохраняю ключ в самом приложении (это только для целей тестирования), а также мои блобы общедоступны.

когда я запускаю в режиме отладки, кажется, что все работает, но фотография не загружается в блоб. Кроме того, я не знаю, как я могу отладить это, чтобы увидеть, была ли какая-либо ошибка от службы BLOB-объектов.

Может ли кто-нибудь сказать мне, что может быть не так?

EDIT1: кажется, что контейнер тоже не создается. я подтвердил это с помощью Azure Blob Explorer

EDIT2: я получаю System.Net.WebException : "The remote server returned an error: NotFound."


person Michael    schedule 27.04.2012    source источник
comment
Какую библиотеку вы используете для доступа к хранилищу WA? Это WA Toolkit для Windows Phone? Откуда ты знаешь, что он не работает? (Какие инструменты вы используете для поиска BLOB-объектов в хранилище BLOB-объектов?)   -  person user94559    schedule 27.04.2012
comment
@smarx я использую WindowsPhoneCloud.StorageClient и Microsoft.Samples.Data.Services.Client из WAT для WP. Чтобы узнать, был ли загружен большой двоичный объект, я использую обозреватель хранилища BLOB-объектов Azure: blobexplorer.codeplex.com.   -  person Michael    schedule 27.04.2012


Ответы (2)


После долгих часов я наконец обнаружил, что проблема была в этой строке:

string containerName = "reportsPhotos";

В соответствии с здесь все буквы в имени контейнера должны быть нижний регистр. Изменение его на reportsphotos решило проблему

Это было хорошо проведенное время.

person Michael    schedule 28.04.2012

Можете ли вы попробовать сделать это так:

// Retrieve storage account from connection-string
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    RoleEnvironment.GetConfigurationSettingValue("StorageConnectionString"));

// Create the blob client
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// Retrieve reference to a previously created container
CloudBlobContainer container = blobClient.GetContainerReference("mycontainer");

// Retrieve reference to a blob named "myblob"
CloudBlob blob = container.GetBlobReference("myblob");

// Create or overwrite the "myblob" blob with contents from a local file
using (var fileStream = System.IO.File.OpenRead(@"path\myfile"))
{
    blob.UploadFromStream(fileStream);
} 

Это из:

http://www.windowsazure.com/en-us/develop/net/how-to-guides/blob-storage/#upload-blob

person Tom    schedule 27.04.2012
comment
Не кажется уместным для проекта Windows Phone. - person user94559; 27.04.2012