Загрузите несколько файлов blob в виде zip из лазурного хранилища [дубликат]

  SELECT b.name, MAX (b.value) как MaxValue, MAX (b.nothercolumn) как AnotherColumn FROM out_pumptabl INNER JOIN (имя SELECT, MAX (значение) как MaxValue FROM out_pumptabl GROUP BY Name) a ON  a.name = b.name AND a.maxValue = b.value GROUP BY b.Name  

Обратите внимание, что это было бы намного проще, если бы у вас был первичный ключ. Вот пример

  SELECT * FROM out_pumptabl c WHERE PK in (SELECT MAX (PK) как MaxPK FROM out_pumptabl b INNER JOIN (имя SELECT, MAX (значение) как MaxValue FROM out_pumptabl GROUP BY Name  ) a ON a.name = b.name AND a.maxValue = b.value)  
14
задан Steve 17 September 2013 в 15:23
поделиться

6 ответов

Я думаю, вы можете использовать webjob или роль рабочего для этого. Когда вы получите запрос пользователя, нажмите этот запрос в очередь, а затем верните идентификатор задания пользователю. Webjob или рабочая роль извлекают запрос из очереди и загружают эти файлы и зашифровывают их, а затем загружают zip-файл обратно в Storage blob. Код передней стороны может использовать опрос ajax roll с идентификатором задания, чтобы получить реальный URL-адрес загрузки, когда это будет сделано.

0
ответ дан Crazy Crab 15 August 2018 в 22:15
поделиться

Я был бы на 99% уверен, что для любой zip-библиотеки, которую вы используете, потребуются локальные ресурсы / локальные файлы для создания zip-файла.

Посмотрите на Azure Local Storage для рабочих ролей .

http://vkreynin.wordpress.com/2010/01/10/learning-azure-local-storage-with-me/

Вы можете указать количество локального хранилища в своей рабочей роли, чтобы сохранить доступный контент в процессе.

, например

// Создать раздел локального хранилища в вашей конфигурации .

<WebRole name="...">
 <LocalResources>
   <LocalStorage name="myLocalStorage" sizeInMB="50"/>
 </LocalResources>
</WebRole>

// Затем сохраните ваши файлы в локальном хранилище

CloudBlobContainer container = blobClient.GetContainerReference("myfiles");
CloudBlob blob = container.GetBlobReference("2b5f8ea6-3dc2-4b77-abfe-4da832e02556/AppList/isjirleq/mydocs1.doc");

LocalResource myStorage = RoleEnvironment.GetLocalResource("myLocalStorage");
string filePath = Path.Combine(myStorage.RootPath, "mydocs1.doc");
blob.DownloadToFile(filePath);

. Когда у вас есть все ваши файлы, сохраненные в LocalStorage, используйте ZipLibrary, чтобы собрать все ваши файловые пути вместе

2
ответ дан Eoin Campbell 15 August 2018 в 22:15
поделиться
  • 1
    Я бы рекомендовал использовать для этой цели Azure Drive вместо локального хранилища. Во-первых, Azure Drive может быть до 1 ТБ (что намного больше, чем локальное хранилище), а во-вторых, данные, однажды записанные на диск, сохраняются. – Gaurav Mantri 17 September 2013 в 16:48
  • 2
    Ну, он сказал, что хочет вернуть его обратно в BlobStorage. так что, по-видимому, он не хочет упорствовать дважды. Но да, Лазурный Диск будет работать, полагая, что ему нужно дополнительное пространство. – Eoin Campbell 17 September 2013 в 16:50
  • 3
    Я бы пропустил Azure Drive. Операция zip - это точка за раз. Загрузите несколько файлов на локальный диск, застегните молнию, нажмите назад к блобу. Если локальный диск выходит из строя во время работы, не беспокойтесь - просто используйте сообщение очереди, чтобы сохранить «zip вверх эти файлы»; команда. Кроме того, если вы используете Azure Drives, вам нужен один диск на экземпляр роли; это, похоже, требует больших усилий для получения минимальной выгоды. – David Makogon 19 September 2013 в 06:11
  • 4
    дать согласие. Максимальный объем хранения, который вы можете назначить, ограничен конкретным размером виртуальной машины, поэтому единственная причина для перехода на «лазурный диск» - было бы, если у вас есть особенно большие файлы zip / содержимое файла для обработки относительно небольшой рабочей ролью – Eoin Campbell 19 September 2013 в 10:38

Поскольку хранилище blob является «просто» хранилищем объектов, вам нужно будет загружать их где-нибудь (это может быть роль веб-/ работника или ваш локальный компьютер), zip их и затем повторно загружать zip-файл. Это единственный способ сделать это, насколько мне известно.

2
ответ дан Gaurav Mantri 15 August 2018 в 22:15
поделиться

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

Утилиты сжатия работают только с локальными ресурсами. Сама Azure Storage не имеет понятия / способности иметь возможность сжимать некоторые файлы сама по себе

2
ответ дан Igorek 15 August 2018 в 22:15
поделиться

Не думайте, что azure предоставляет какие-либо функции из окна для zipping. Если вам нужно избегать поворота времени, возможно, использование роли рабочего фона - хорошая идея, которая выберет ваши файлы из определенной очереди. Запишите их, загрузите их и сохраните url для вы где-то вроде sql db.Я делал схожие вещи, общаюсь с db, поэтому вы можете быть уверены, что он будет работать очень быстро, если пользователь не поймет, что его на самом деле не происходит на лицевой стороне.

-1
ответ дан Mandar Jogalekar 15 August 2018 в 22:15
поделиться

Мы решили эту проблему (частично), запустив файлы непосредственно в выходной поток, используя потоки blob. Это позволяет избежать проблемы с загрузкой zipping, а затем отправлять и избегать задержки, когда это происходит (мы использовали ICSharpZipLib, reference ). Но это все равно означает маршрутизацию потока через веб-сервер:

  public void ZipFilesToResponse(HttpResponseBase response, IEnumerable<Asset> files, string zipFileName)
    {
        using (var zipOutputStream = new ZipOutputStream(response.OutputStream))
        {
            zipOutputStream.SetLevel(0); // 0 - store only to 9 - means best compression
            response.BufferOutput = false;
            response.AddHeader("Content-Disposition", "attachment; filename=" + zipFileName);
            response.ContentType = "application/octet-stream";

            foreach (var file in files)
            {
                var entry = new ZipEntry(file.FilenameSlug())
                {
                    DateTime = DateTime.Now,
                    Size = file.Filesize
                };
                zipOutputStream.PutNextEntry(entry);
                storageService.ReadToStream(file, zipOutputStream);
                response.Flush();
                if (!response.IsClientConnected)
                {
                   break;
                }
            }
            zipOutputStream.Finish();
            zipOutputStream.Close();
        }
        response.End();
    }

Служба хранения просто делает это:

public void ReadToStream(IFileIdentifier file, Stream stream, StorageType storageType = StorageType.Stored, ITenant overrideTenant = null)
    {
        var reference = GetBlobReference(file, storageType, overrideTenant);
        reference.DownloadToStream(stream);
    }
private CloudBlockBlob GetBlobReference(IFileIdentifier file, StorageType storageType = StorageType.Stored, ITenant overrideTenant = null)
        {
            var filepath = GetFilePath(file, storageType);
            var container = GetTenantContainer(overrideTenant);
            return container.GetBlockBlobReference(filepath);
        }
23
ответ дан Ron 15 August 2018 в 22:15
поделиться
  • 1
    Я знаю, что это может быть сложно ответить, но какой смысл в том, сколько времени это занимает в зависимости от количества / размера файлов? Я просматриваю контейнер, полный 50-200 изображений (каждый около 5-7 МБ), в один почтовый ящик для кого-то, чтобы скачать. Прежде чем я спустился по этому маршруту, мне было бы любопытно, если ваш опыт заключается в том, что для создания этого почтового индекса может потребоваться 30 секунд или 10 минут или даже дольше? – Sam Storie 25 January 2016 в 18:51
  • 2
    В этом случае zip-файл записывается непосредственно в поток ответов, поэтому загрузка начинается, как только записывается поток файлов. Таким образом, задержка является незначительной и до тех пор, пока вы можете читать и индексировать данные быстрее, чем загружается (что вы можете в большинстве ситуаций). Вот почему мы сделали это так. – Richard 26 January 2016 в 14:53
  • 3
    Ничего себе, он даже не зарегистрировал меня, что вы передавали ответ в этом коде, но это имеет смысл. Очевидно, это то, что вы изначально сказали сейчас, когда я перечитаю ваш ответ;) Очень крутой подход! – Sam Storie 26 January 2016 в 15:27
  • 4
    Для сетевого ядра: используйте response.Body, убедитесь, что вы установили сборку предварительного просмотра SharpZipLib (совместимую с netstadnard) и удалите код, который дает синтаксические ошибки (например, BufferOutput), – CularBytes 24 June 2018 в 11:36
Другие вопросы по тегам:

Похожие вопросы: