Пожалуйста, предложите способ хранения временного файла в Windows Azure. - PullRequest
1 голос
/ 07 января 2012

Здесь у меня есть простая функция на ASP.NET MVC3, которая размещается на Azure.

  • 1-й шаг: пользователь загружает изображение
  • 2-й шаг: пользователь обрезает загруженное изображение
  • 3-й: система сохраняет обрезанное изображение, удаляет временный файл, который является загруженным исходным изображением

Вот проблема, с которой я сейчас сталкиваюсь: где хранить временный файл?

Я пробовал где-то в системе Windows или в LocalResources: проблема в том, что эти ресурсы относятся к экземпляру, поэтому нет никакой гарантии, что код экземпляра показывает, что изображение для обрезки будет таким же кодом на том же экземпляре, который был сохраненвременный файл.

Есть ли у вас какие-либо идеи по поводу проблемы временного файла?

  1. обычно файл существует некоторое время, прежде чем удалить его
  2. временный файлдолжен быть независимым от экземпляра
  3. Лучше, чтобы файл мог иметь некоторую настройку истечения (например, 1H) для удаления самого себя в случае сбоя кода где-либо.

Ответы [ 4 ]

2 голосов
/ 08 января 2012

OK.Таким образом, то, что вы ищете, - это то, что является общим хранилищем, но срок его действия истекает.Amazon только что анонсировала довольно приятную настройку, называемую сроком действия объекта (https://forums.aws.amazon.com/ann.jspa?annID=1303). Ничего подобного для хранилища Windows Azure, пока, к сожалению, нет, но это не значит, что мы не можем придумать какой-то другой подход, даже придумать лучший (более дорогой)эффективный) подход.

Вы говорите, что он должен быть независимым от экземпляра, что означает, что использование локального временного диска не подходит. Как уже говорили другие, мой первоначальный подход будет касаться хранилища BLOB-объектов, но у вас будут усилия по очисткеЕсли вы работаете с большими изображениями (> 1 МБ) или с низкой пропускной способностью (<100rps), я думаю, что хранилище BLOB-объектов является единственным вариантом. Если вы работаете с изображениями меньшего размера и высокой пропускной способностью, то затраты на транзакции для хранилища BLOB-объектов начнутдействительно добавьте (у меня скоро выйдет официальный документ, в котором показано некоторое моделирование этого, но некоторые быстрые мысли приведены ниже). </p>

Для сценария с небольшими изображениями и высокой пропускной способностью лучшим вариантом может быть использование WindowsAzure Cache как ваш временный stплощадь застройки.На первый взгляд это будет очень дорого;на основе ГБ (110 ГБ / месяц для кэша, 12c / ГБ для хранилища).Но с хранилищем ваши транзакции оплачиваются, тогда как с Cache они «бесплатны».(Квоты здесь: http://msdn.microsoft.com/en-us/library/hh697522.aspx#C_BKMK_FAQ8) Это действительно может сложиться; например, использование временных файлов размером 100 КБ, которые хранятся в течение 20 минут, с пропускной способностью системы 1500 об / с при использовании Cache составляет около 1000 долларов в месяц против 15000 долларов в месяц для транзакций хранения.

Подход Azure Cache стоит рассмотреть, но, безусловно, это «лучший» подход, который я действительно хочу знать;

  1. Размер изображений
  2. Пропускная способность в час
  3. Немного подробнее о фактическом взаимодействии клиента с сервером во время процесса кадрирования? Это интерактивный процесс, когда пользователь вставляет iamge в свой браузер и визуально кадрирует? Или это простопростой урожай?
1 голос
/ 07 января 2012

Вот то, что я вижу в качестве возможного подхода:

  1. пользователь загружает картинку
  2. ваш код сохраняет ее в BLOB-объекте и имеет некоторый бэкэнд данных, чтобы узнать отношение между пользователемсеанс и загруженное изображение (пометить его как временное изображение)
  3. отобразить изображение в интерфейсе пользовательского интерфейса обрезки
  4. когда пользователь завершит обрезку на клиенте:

    4.1.получить оригинал из BLOB-объекта

    4.2.обрезать его в соответствии с данными, полученными от пользователя

    4.3.удалите оригинал из большого двоичного объекта и запись в бэкэнде данных, использованную в шаге 2

    4.4.сохраните финальный файл в другом BLOB-объекте (финальном BLOB-объекте).

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

Обратите внимание, что даже в WebRole у вас все еще есть потомок RoleEntryPoint , и вы все равно можете переопределить метод Run .Имплантируя бесконечный цикл в методе Run () (этот метод должен никогда выходить!), Вы можете проверить, есть ли что-нибудь для удаления каждые N секунд (в зависимости от вашего Thread.Sleep () в Run ().

0 голосов
/ 26 июля 2016

Под образцом вам помогут. https://code.msdn.microsoft.com/How-to-store-temp-files-in-d33bbb10

у вас есть два пути к временному файлу в Azure. 1, вы можете использовать функции Path.GetTempPath и Path.GetTempFilename () для имени временного файла 2, вы можете использовать BLOB-объект Azure, чтобы смоделировать его.

    private long TotalLimitSizeOfTempFiles = 100 * 1024 * 1024;
    private async Task SaveTempFile(string fileName, long contentLenght, Stream inputStream)
    {
        try
        {
            //firstly, we need check the container if exists or not. And if not, we need to create one.
            await container.CreateIfNotExistsAsync();

            //init a blobReference
            CloudBlockBlob tempFileBlob = container.GetBlockBlobReference(fileName);

            //if the blobReference is exists, delete the old blob
            tempFileBlob.DeleteIfExists();

            //check the count of blob if over limit or not, if yes, clear them.
            await CleanStorageIfReachLimit(contentLenght);

            //and upload the new file in this
            tempFileBlob.UploadFromStream(inputStream);
        }
        catch (Exception ex)
        {
            if (ex.InnerException != null)
            {
                throw ex.InnerException;
            }
            else
            {
                throw ex;
            }
        }
    }

    //check the count of blob if over limit or not, if yes, clear them. 
    private async Task CleanStorageIfReachLimit(long newFileLength)
    {
        List<CloudBlob> blobs = container.ListBlobs()
            .OfType<CloudBlob>()
            .OrderBy(m => m.Properties.LastModified)
            .ToList();

        //get total size of all blobs.
        long totalSize = blobs.Sum(m => m.Properties.Length);

        //calculate out the real limit size of before upload
        long realLimetSize = TotalLimitSizeOfTempFiles - newFileLength;

        //delete all,when the free size is enough, break this loop,and stop delete blob anymore
        foreach (CloudBlob item in blobs)
        {
            if (totalSize <= realLimetSize)
            {
                break;
            }

            await item.DeleteIfExistsAsync();
            totalSize -= item.Properties.Length;
        }
    }
0 голосов
/ 07 января 2012

Вы можете использовать хранилище BLOB-объектов Azure. Взгляните на этот учебник.

...