使用JsonConverter处理上传文件的路径问题

目录
  • 场景
  • 解决方法
  • 使用

场景

我们上传一个文件,把文件保存到服务器上,会有一个明确的物理路径,由于需要从前端访问这个文件,还需要web服务器中的一个虚拟路径。这个虚拟路径的存储会有一个问题,我们应该在数据库里存什么?是带域名的全路径,还是相对于web根目录的相对路径?

现在很多架构都是前后分离的,所以前端访问的url是全路径比较好,不像之前前后都是一个项目中,数据库存相对路径,前端也使用相对路径访问没有问题。
如果存全路径,域名更换的时候就比较麻烦,需要手动把数据库里的数据替换一下。如果存相对路径,返回前端的时候需要手动的补全路径,也不是太好。

解决方法

我们可以使用JsonConverter 来自动处理一下,具体方法是保存相对路径,返回的时候自动加上前缀组成全路径。

/// <summary>
/// 处理图片文件前缀,数据库中存相对路径即可
/// </summary>
public class JsonUrlPrefixConverter : JsonConverter
{
    private string urlPrefix;
    public JsonUrlPrefixConverter()
    {
        urlPrefix ="htttp://www.abc.com"; //这里前缀可以做成配置,换域名时改一下配置即可
    }

    public JsonUrlPrefixConverter(string flag)
    {
        if (flag == "something")
        {
            urlPrefix = "htttp://www.123.com";
        }
    }

    public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
    {
        if (value != null)
        {
            if (value is IEnumerable<string> arr)
            {
                writer.WriteStartArray();
                foreach (var str in arr.Select(x =>
                             x.StartsWith("http", StringComparison.OrdinalIgnoreCase) ? x : urlPrefix + x))
                {
                    writer.WriteValue(str);
                }
                writer.WriteEndArray();
            }
            else if (value is string str && !str.StartsWith("http", StringComparison.OrdinalIgnoreCase))
            {
                if (str.HasValue())
                    str = urlPrefix + str;
                writer.WriteValue(str);
            }
            else
            {
                writer.WriteValue(value);
            }
        }
        else
        {
            writer.WriteValue(value);
        }
    }

    public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue,
        JsonSerializer serializer)
    {
        if (objectType == typeof(string))
        {
            var str = serializer.Deserialize<string>(reader);
            return str;
        }

        if (objectType == typeof(List<string>))
        {
            var list = serializer.Deserialize<List<string>>(reader);

            return list.Select(x => x.Replace(urlPrefix, "")).ToList();
        }

        if (objectType == typeof(string[]))
        {
            var arr = serializer.Deserialize<string[]>(reader);
            return arr.Select(x => x.Replace(urlPrefix, "")).ToArray();
        }

        return reader.Value;
    }

    public override bool CanConvert(Type objectType)
    {
        //请自觉用于 string[]、string、List<string>类型
        return true;
    }
}

使用

JsonUrlPrefixConverter 使用了 Newtonsoft.Json,所以在新的 dotnet 项目中需要指定一下序列话还使用 Newtonsoft.Json

builder.Services.AddControllers()
.AddNewtonsoftJson(options =>
{
    //忽略循环引用问题
    options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});

然后在上传路径的字段上加JsonUrlPrefixConverter 便可以自动处理。
如头像字段:

    /// <summary>
    /// 头像
    /// </summary>
    [JsonConverter(typeof(JsonUrlPrefixConverter))]
    public string Avatar { get; set; } = "";

如前端保存时传给后端的是 "http://www.abc.com/upload/avatar.jpg" ,经过 JsonUrlPrefixConverter 处理,会得到 "/upload/avatar.jpg" 保存到数据库,当从后端返回到前端的时候,会自动加上前缀,又变成了 "http://www.abc.com/upload/avatar.jpg" 。
这样如果域名变了,修改一下配置的前缀即可。

到此这篇关于使用JsonConverter处理上传文件的路径的文章就介绍到这了,更多相关JsonConverter处理上传文件的路径内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • .Net 自定义转换器JsonConverter的使用详解

    目录 场景描述 通过JsonSerializerOptions参数,绑定JsonConverter来实现 在实体类的属性上 增加JsonConverter注解来实现 参考官方文档 场景描述 例如api返回了以下json串 (infcode的值有可能时string 也可能时number 有时候返回时这个 { "infcode": -1, "detail_msg": null } 有时后也可能时这个 { "infcode": "-1&quo

  • ASP.NET2.0服务器控件之类型转换器

    类型转换器是实现自定义服务器控件属性过程中比较重要的内容.本文将对类型转换器的基本概念和实现方法进行介绍. 1. 类型转换器基本概念 类型转换器是自定义服务器控件的辅助性功能实现.它主要用于执行从字符串表示形式到指定类型之间的双向转换.例如,以文本形式表示属性值,将用户输入的文本转换为相应数据类型等等,都应用了类型转换器. 对于多数基本数据类型(如Int32.Bool.Char.String.枚举类型等),.net框架已经为它们提供了默认的类型转换器,这些类型转换器完成从字符串到相关值的转换并执

  • 使用JsonConverter处理上传文件的路径问题

    目录 场景 解决方法 使用 场景 我们上传一个文件,把文件保存到服务器上,会有一个明确的物理路径,由于需要从前端访问这个文件,还需要web服务器中的一个虚拟路径.这个虚拟路径的存储会有一个问题,我们应该在数据库里存什么?是带域名的全路径,还是相对于web根目录的相对路径? 现在很多架构都是前后分离的,所以前端访问的url是全路径比较好,不像之前前后都是一个项目中,数据库存相对路径,前端也使用相对路径访问没有问题.如果存全路径,域名更换的时候就比较麻烦,需要手动把数据库里的数据替换一下.如果存相对

  • PHP上传文件时自动分配路径的方法

    本文实例讲述了PHP上传文件时自动分配路径的方法.分享给大家供大家参考.具体分析如下: 网站上传文件时,如果是小的企业站,放在一个目录还没问题,当网站大了,上传的文件多了,我们就不能放在同一个目录了,这里我们就来讲讲用PHP自动给上传的文件分配路径的方法. PHP分配上传文件的路径实例 主要程序片段如下: 复制代码 代码如下: <?php    /*数字方式分配路径*/    function allotPath($id, $extend='jpg') {       $folders = st

  • 使用ajaxfileupload.js实现ajax上传文件php版

    无论是PHP,还是其他的服务端脚本都提供了文件上传功能,实现起来也比较简单.而利用JavaScript来配合,即可实现Ajax方式的文件上传.虽然jQuery本身没有提供这样的简化函数,但有不少插件可以实现.其中,Phpletter.com提供的ajaxfileupload.js是一个轻量的插件,而且编写方式与jQuery提供的全局方法$.post()非常相似,简单易用. 不过,该插件实在太简化了,除了可提供需上传文件的路径外,也就不能传递额外的值到后台服务端.所以,我修改了一下该脚本,增加个一

  • Ajax上传文件进度条Codular

    现在,人们喜欢在浏览网页时做一些其他事情而不离开该网页,这通常是通过ajax来实现.大多数情况,人们使用jQuery来实现,但是随着浏览器的进步,人们比不需要这么做.这里我们将介绍如何在不离开页面的情况下将文件上传到服务器,我们将使用与我们之前的文章中使用的相同的后端PHP代码. 该脚本将上传文件至服务器,同时显示上传进度,并最终返回上传文件的链接地址.在某些情况下,你可能想要返回上传文件的id或者其他的应用信息. Note: 该代码不支持较老的ie浏览器,通过Can I use我们只支持ie1

  • 解析ajaxFileUpload 异步上传文件简单使用

    这里就简单介绍下ajaxFileUpload,jQuery插件AjaxFileUpload可以实现ajax文件上传.我们的项目采用的是jsp跟js分离的架构,所以代码如下. 首先是jsp部分: <!-- <form method="post"> --> <input type="file" name="n_file" id="fileToUpload" value="上传表格"

  • jQuery实现jQuery-form.js实现异步上传文件

    做为一个前端开发,你肯定遇到过这样的需求:异步上传文件,还要兼容IE 8.[纳尼,没遇到过,那你们产品和UI对你也忒好了吧. 遇到这种需求,如果项目不是很赶,可以自己用iframe来做,如果项目比较赶的话,就可以使用jquery-form.js插件来实现,方便快捷. 一.举个栗子 1.先下载 JQuery-form.js文件并引入,也可以使用CDN,因为是jquery插件,所以需要先引入jquery. 2.html 部分: <form action='' enctype="multipar

  • Java实现ftp上传下载、删除文件及在ftp服务器上传文件夹的方法

    一个JAVA 实现FTP功能的代码,包括了服务器的设置模块,并包括有上传文件至FTP的通用方法.下载文件的通用方法以及删除文件.在ftp服务器上传文件夹.检测文件夹是否存在等,里面的有些代码对编写JAVA文件上传或许有参考价值,Java FTP主文件代码: package ftpDemo; import java.io.DataOutputStream; import java.io.InputStream; import java.io.OutputStream; import sun.net

  • springboot以FTP方式上传文件到远程服务器

    一.html代码   <div class="layui-form-item"> <label class="layui-form-label">上传附件:</label> <div class="layui-input-block doc-litpic"> <button type="button" name="avatar" class="

  • C#实现FTP上传文件的方法

    1.通过用FTP进行上传文件,首先要实现建立FTP连接,一般建立FTP连接,需要知道FTP配置有关的信息.一般要在Bean中建立一个ServiceFileInfo.cs文件进行记录,一般需要FTP地址.登录用户名和登录密码.然后通过其他页面进行访问读取.代码样式如下: class ServiceFileInfo { // service1 public static string txtFilePath = @"ftp://12.128.128.01/FileName/"; //use

  • Java selenium上传文件的实现

    目录 下载和安装AutoIt 1.打开AutoIt的官网下载 下载和安装AutoIt 文件上传是自动化中棘手的部分,目前selenium并没有提供上传的实现api,所以知道借助外力来完成,如AutoIt.sikuli. AutoIt , 这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)的自动化操作,利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现自动化任务; 1.打开AutoIt的官网下载 AutoIt下载链接:https://www.autoit

随机推荐