首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于Asp.Net内核的Kendo数据库驱动的Imagebrowser

用于Asp.Net内核的Kendo数据库驱动的Imagebrowser
EN

Stack Overflow用户
提问于 2019-04-24 10:17:22
回答 1查看 959关注 0票数 1

这是一个我自己回答的问题。我花了几个小时试图使它工作,基于这里提供的示例:https://github.com/telerik/ui-for-aspnet-mvc-examples/tree/master/editor/database-image-browser/DatabaseImageBrowser,因为我没有维护博客,这是我记录这个的方式,以防其他人面临相同的用例,这可能会节省他们一些时间

问题是:如何实现Imagebrowser,它不是与本地文件夹一起工作,而是与数据库一起工作。Telerik提供的示例使用的是虚拟文件夹,这些文件夹存储在一个表中,图像链接在一个单独的表中,并与文件夹Id链接。因为我不想使用文件夹,所以我需要找到一种解决这个问题的方法。另外:IImageBrowserController只提供一个同步接口,这使得它不适合异步操作:

代码语言:javascript
复制
public interface IImageBrowserController : IFileBrowserController
{
    IActionResult Thumbnail(string path);
}

public interface IFileBrowserController
{
    ActionResult Create(string path, FileBrowserEntry entry);
    ActionResult Destroy(string path, FileBrowserEntry entry);
    JsonResult Read(string path);
    ActionResult Upload(string path, IFormFile file);
}

第二个问题是:如何将图像读取路径从虚拟路径.Image("~/Content/UserFiles/Images/{0}")转换为mvc路由

最后,如何实现自定义控制器或Razor页面,这样就不需要在Asp.Net核心上使用虚拟文件夹。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-24 10:25:04

首先,创建一个适合异步操作的接口:

代码语言:javascript
复制
public interface IImageBrowserControllerAsync
{
    Task<IActionResult> Create(string name, FileBrowserEntry entry);
    Task<IActionResult> Destroy(string name, FileBrowserEntry entry);
    Task<IActionResult> Image(string path);
    Task<JsonResult> Read(string path);
    Task<IActionResult> Thumbnail(string path);
    Task<IActionResult> Upload(string name, IFormFile file);
}

接下来,创建控制器实现。我会省略几种方法,这样我就不会浪费宝贵的阅读时间。其实现类似于所提供的方法:

代码语言:javascript
复制
public class ImageBrowserController : ControllerBase, IImageBrowserControllerAsync
{
    private IImageRepository _repo;
    private const int ThumbnailHeight = 80,
        ThumbnailWidth = 80;

    public ImageBrowserController(IImageRepository repo)
    {
        _repo = repo;
    }

    [Route("Image")]
    public async Task<IActionResult> Image(string path)
    {
        var image = await _repo.GetByName(path);
        if (image != null)
        {
            return File(image.Data, image.ContentType);
        }

        return NotFound("Errormessage");
    }

    //read all images, when the widget loads
    [Route("Read")]
    public async Task<JsonResult> Read(string path)
    {
        var images = await _repo.Get(); // do not return the image data. it is not 
        //needed and will clog up your resources
        var fbe = images.Select(x => new FileBrowserEntry
        {
            Name = x.Name,
            EntryType = FileBrowserEntryType.File
        });
        return new JsonResult(fbe);
    }

    //Create thumbnail using SixLabors.Imagesharp library
    [Route("Thumbnail")]
    public async Task<IActionResult> Thumbnail(string path)
    {
        var image = await _repo.GetByName(path);
        if (image != null)
        {
            var i = SixLabors.ImageSharp.Image
                .Load(image.Data);
            i.Mutate(ctx => ctx.Resize(ThumbnailWidth, ThumbnailHeight));

            using (var ms = new MemoryStream())
            {
                i.SaveAsJpeg(ms);
                return File(ms.ToArray(), image.ContentType);
            }
        }
        return NotFound();
    }

    [Route("Upload")]
    public async Task<IActionResult> Upload(string name, IFormFile file)
    {
        if (file == null || file.Length == 0) return BadRequest();
        using (var ms = new MemoryStream())
        {
            file.CopyTo(ms);
            var img = new Entities.Image
            {
                Name = file.FileName,
                ContentType = file.ContentType,
                Data = ms.ToArray()

            };
            await _repo.CreateImage(img);
            return Ok();
        }
    }
}

以下是Imagebrowser / Editor配置:

代码语言:javascript
复制
@(Html.Kendo().Editor()
        .Name("editor")

        .HtmlAttributes(new { style = "width: 100%;height:440px
        .Tools(tools => tools
            .Clear()
            /*omitted config*/
        )
      .ImageBrowser(ib => ib
          //use actionmethod, controller, route values format
          .Image("Image", "ImageBrowser", new {path = "{0}"}) 
          .Read("Read", "ImageBrowser") // path can be null if you don't use folders
          .Destroy("Destroy", "ImageBrowser")
          .Upload("Upload", "ImageBrowser")
          .Thumbnail("Thumbnail", "ImageBrowser"))
      )

不管谁读过这篇文章:我希望这个例子能帮助您节省一些时间在Asp.Net核心上实现这一点。

注意:当读取加载的所有图像时,不要返回byte[]。Kendo只需要一个具有名称和类型属性的FileBrowserEntry。

我强烈建议在这里实现缓存。为每一页加载的数十或数百张图片创建缩略图,将给您的基础设施带来巨大压力。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55827686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档