Есть ли способ скопировать большой двоичный объект из эмулятора локального хранилища в удаленное хранилище Azure?

Я пытаюсь скопировать видеофайл из локального хранилища Azure в удаленное хранилище на C #, чтобы иметь возможность кодировать его с помощью служб мультимедиа Azure.

После получения больших двоичных объектов для копии с помощью метода StartCopy я получаю исключение 404 NOT FOUNT.

destinationBlob.StartCopy(new Uri(sourceBlob.Uri.AbsoluteUri + signature));

Значение sourceBlob.Uri.AbsoluteUri - это локальный Uri (http://127.0.0.1/ params)

Я ожидал, что копия будет выполнена, но вместо этого я получаю ошибку 404.


person Matteo Murdocco    schedule 19.02.2019    source источник
comment
Я ожидал, что копия будет выполнена - я не ожидал, что служба хранилища Azure сможет получить доступ к моему локальному компьютеру.   -  person stuartd    schedule 19.02.2019
comment
код, выполняющий копию, запускается локально, так что да, я ожидаю, что копия будет возможна   -  person Matteo Murdocco    schedule 19.02.2019
comment
URL-адреса работают не так. Вы говорите Azure перейти по URL-адресу и скопировать большой двоичный объект. URL-адрес доступен только локально, поэтому копировать не удается.   -  person stuartd    schedule 19.02.2019


Ответы (2)


  • Вам потребуется два подключения к хранилищу Azure.
  • Вам необходимо подключиться к локальному видеофайлу в эмуляторе и рассматривать его как поток (назовите его localStream).
  • Затем вам нужно открыть конечную (удаленную) конечную точку в хранилище Azure и открыть ее для записи в виде потока (назовите его remoteStream).
  • Затем вы можете выполнить localStream.CopyTo (remoteStream);

Этот пример позволяет вам передать Задачу этой функции, которая принимает Stream как объект для работы. Вам нужно будет настроить utils.GetBlockBlobReference, чтобы он указывал на вашу фактическую ссылку на большой двоичный объект. Этот метод открывает поток для Wtire, вам также может понадобиться тот, который открывает поток для чтения. У меня разные провайдеры для чтения / записи в хранилище.

    public async Task Use(string pointer, Func<System.IO.Stream, Task> useAction)
    {
        if (useAction == null)
        {
            throw new ArgumentNullException(nameof(useAction));
        }

        var blobRef = await utils.GetBlockBlobReference(storageFactory, pointer);
        using (var cloudStream = await blobRef.OpenWriteAsync())
        {
            await useAction(cloudStream);
        }
    }
person Bigtoe    schedule 19.02.2019
comment
Не могли бы вы дать мне несколько советов о том, как этого добиться? - person Matteo Murdocco; 20.02.2019
comment
Добавлен в пример кода, который открывает большой двоичный объект для записи в виде потока. Затем вы можете передать задачу, которая принимает этот поток и может писать в него. - person Bigtoe; 20.02.2019

К сожалению, вы не сможете сделать это с помощью Copy Blob функций. Причина в том, что Copy Blob операция - это асинхронная операция на стороне сервера, и для ее работы с источником копирования потребуется служба хранилища.

Поскольку источником копирования является большой двоичный объект в локальном эмуляторе, служба хранилища не может этого достичь, и, следовательно, вы получаете ошибку 404.

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

person Gaurav Mantri    schedule 19.02.2019