Как создать символическую ссылку на изображения в Visual Studio 2017 с проектом ASP.NET Core? - PullRequest
0 голосов
/ 06 января 2019

У меня есть проект, написанный на C# поверх платформы ASP.NET Core 2.2.

У меня есть изображения активов, расположенные в папке за пределами моего проекта, которые мне нужно сделать доступными для внешнего мира. Мои изображения физически расположены на c:/public_assets/photos. Когда мое приложение работает, URI https://mydomain/public/any_image.jpg должен показывать изображение, найденное в c:/public_assets/photos/any_image.jpg.

Тогда я бы рендерил свои фотографии, используя бритвенный вид, вот так

<img src="~/public/any_image.jpg" alt="..." />

Я надеюсь, что это будет параметр для добавления в файл конфигурации проектов, поэтому при развертывании проекта в рабочей среде я просто изменю настройки.

Ответы [ 3 ]

0 голосов
/ 06 января 2019

Используйте метод расширения FileServer, добавьте текущий код к Configuration методу вашего Startup.cs:

public class Startup {

    public void Configure(IApplicationBuilder app) {
        // other configure code
        var opts = new FileServerOptions {
            RequestPath = "/public",
            FileProvider = new PhysicalFileProvider(@"c:/public_assets/photos")
        };
        app.UseFileServer(opts);
    }

}

Тогда вы можете использовать URL-адреса изображений на страницах бритвы:

<img src="~/public/any_image.jpg" alt="..." />

Вы также можете поместить две строки пути в appSettings.json и прочитать их из конфигурации.

0 голосов
/ 06 января 2019

Вам нужно добавить статический файл в конструктор приложений. Раздел Служба файлов вне корневого веб-раздела дает хорошее описание того, как это сделать.

В вашем случае перейдите к классу Startup. В public void Configure(IApplicationBuilder app ....) добавьте следующий код

app.UseStaticFiles(new StaticFileOptions
{
    FileProvider = new PhysicalFileProvider(@"c:/public_assets/photos"),
    RequestPath = "/photos"
});

Теперь вы сможете отображать фотографии, используя такие представления, как

<img src="~/public/any_image.jpg" alt="..." />
0 голосов
/ 06 января 2019

Добавить новый контроллер

public class publicController : Controller
{
     public FileResult pic(string id)
    {
        var fileName = id;
        if (fileName.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0) throw new Exception();
        string absolutePath = Path.GetFullPath(Path.Combine("c:/public_assets/photos/", fileName));
        if (!System.IO.File.Exists(absolutePath)) throw new Exception();
        byte[] fileBytes = System.IO.File.ReadAllBytes(absolutePath);
        string fileExtension = Path.GetExtension(absolutePath).Replace(".", "");
        fileName = Path.GetFileName(absolutePath);
        return File(fileBytes, "image/" + fileExtension, fileName);
    }
}

Редактировать

  • retrun NotFound
  • не читать файл в память
  • проверить расширение файла allwoed

    public class publicController : Controller
    {
        public ActionResult pic(string id)
        {
            var fileName = id;
            if (fileName.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0) return NotFound();
            string absolutePath = Path.GetFullPath(Path.Combine("c:/public_assets/photos/", fileName));
            if (!System.IO.File.Exists(absolutePath)) return NotFound();
            string fileExtension = Path.GetExtension(absolutePath).Replace(".", "").ToLower();
            if (fileExtension != "jpg") return NotFound();
            var fileBytes = System.IO.File.OpenRead(absolutePath);
            fileName = Path.GetFileName(absolutePath);
            return File(fileBytes, "image/" + fileExtension, fileName);
        }
    }
    

затем позвоните

  http://xxxxxxxxx/public/pic/1.jpg

  http://xxxxxxxxx/public/pic/MikeA.jpg
...