Sasha_Odesskiy
@Sasha_Odesskiy
бла-бла-бла!

Как сделать загрузку изображений на сервер?

Приветствую.
Я видел на сайте ВКонтакте путь у изображению такой:
example.com/photos/GdWj4gfd/HhfdTec/2gbdeEws/AsAda.jpeg
Как реализовать так на своём сайте?
________________________________________________________________________________________

P.S. Заранее Благодарю.
  • Вопрос задан
  • 69 просмотров
Пригласить эксперта
Ответы на вопрос 3
gans5131
@gans5131
web-developer
Предполагаю, что необходимо реализовать неявный путь, чтобы нельзя было например подобрать путь до другого файла.

Можно сделать так. Как-нибуть шифровать название папок и подпапок, а формировать из кусков даты например и соли. Будет что-то типа.

example.com/photos/encode(Год+соль)/encode(Месяц+соль)/encode(День+соль)/unic().jpeg

Тоже есть свои изъяны конечно, но опять же нужно иметь полное понимание задачи.
Ответ написан
Комментировать
anton_reut
@anton_reut
Начинающий веб-разработчик
Функция mkdir() может создавать папки, а уж сгенерить случайное имя это проще простого.
Ответ написан
Комментировать
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Посмотрите мое решение. Я вообще храню картинки по идентификаторам long.
Как перезаписать имя файла во вложенную папку для Nginx?

Код контроллера, думаю легко адаптируете под ваши нужды.
var now = DateTime.Now;
                        var image = new DbFile
                        {
                            Created = now,
                            CreatedBy = customer.Id,
                            Path = uploadedFile.FileName
                        };

                        var file = await _ctx.Files.Create(image);                        
                        var fullPath = _upHelper.GetFullPathForFile(file.Id, image.Path);
                        var path = new FileInfo(fullPath).DirectoryName;

                        if (!Directory.Exists(path))
                        {
                            Directory.CreateDirectory(path);
                        }
                        using (var fileStream = new FileStream(fullPath, FileMode.Create))
                        {
                            await uploadedFile.CopyToAsync(fileStream);
                            var md = new FileInfoModel()
                            {
                                Id = file.Id,
                                Created = file.Created,
                                CreatedBy = file.CreatedBy,
                                Name = file.Path,
                                Url = _upHelper.GetUriPath(file.Id, file.Path)
                            };
                            gattachments.Add(md);
                        }


Код хэлпера

private string GetPathFromId(long id, string fileName)
        {
            var ext = new FileInfo(fileName).Extension;
            var fname = id.ToString().Reverse().ToArray();
            if (fname.Length == 1)
                return $"{fname[0]}/{id}{ext}";
            if (fname.Length > 1)
                return $"{fname[0]}/{fname[1]}/{id}{ext}";
            throw new ArgumentOutOfRangeException("No file with id: " + id);
        }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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