Reyhan M.T Ответов: 2

Как сохранить изображение в папке с разностным именем image (например: image001, image002, dst) в веб-сервисе


I want when insert a new base64 in web service it is create image002.jpg in my folder path because image001.jpg already in folder path. Could you help how to fix it ?


Что я уже пробовал:

This is my coding in webservice

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

public void Base64ToImage(string imagestr)
    {

        DbAccessConnection conn = getActiveConnection();
        try
        {
            beginTransaction(conn);

            byte[] bytes = Convert.FromBase64String(imagestr);

            using (MemoryStream ms = new MemoryStream(bytes))
            {
                Image pic = Image.FromStream(ms);
                pic.Save("C:/image/image001.jpg");
            }

            commitTransaction(conn);
            Responder.writeResponse(true, "Sucess Convert Base64 String To Image");
        }
        catch (Exception ex)
        {
            rollbackTransaction(conn);
            Responder.writeResponse(false, ex.Message);
        }
    }

2 Ответов

Рейтинг:
9

OriginalGriff

Прочитайте все файлы, находящиеся в данный момент в папке: Каталог.Заражен[^] сделает это за вас, и вы можете предоставить подстановочные знаки, такие как "image*.jpg", чтобы ограничить их.
Затем вы можете просто отсортировать их по пути - но только с тремя цифрами у вас могут возникнуть проблемы довольно быстро, так как строковые сравнения работают на первом несоответствующем символе, поэтому, как только вы превысите три цифры, порядок будет нарушен.

Лучший подход-использовать пользовательский компаратор и возвращать имя файла с максимальным количеством, разбивая имя файла вниз и преобразуя числовую часть в целое число.

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

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


Рейтинг:
15

RickZeeland

Попробовать это:

static int picCount = 1;

public void Base64ToImage(string imagestr)
    {

        DbAccessConnection conn = getActiveConnection();
        try
        {
            beginTransaction(conn);

            byte[] bytes = Convert.FromBase64String(imagestr);

            using (MemoryStream ms = new MemoryStream(bytes))
            {
                Image pic = Image.FromStream(ms);
                pic.Save("C:/image/image" + picCount.ToString("D3") + ".jpg");
                picCount++;
            }

            commitTransaction(conn);
            Responder.writeResponse(true, "Sucess Convert Base64 String To Image");
        }
        catch (Exception ex)
        {
            rollbackTransaction(conn);
            Responder.writeResponse(false, ex.Message);
        }
    }

Если вы перезапустите свой веб-сервис, подсчет снова начнется с 1, поэтому, если вы хотите продолжить с последнего числа, вам придется сохранить его (например, в качестве настройки).


Reyhan M.T

Это код работает, большое вам спасибо

RickZeeland

Хорошее начало нового года :)

Richard MacCutchan

В Суррее все еще 2019 год.

RickZeeland

Ой, ошибка округления !