场景

我们上传一个文件,把文件保存到服务器上,会有一个明确的物理路径,由于需要从前端访问这个文件,还需要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处理上传文件的路径的更多相关文章

  1. ie下获取上传文件全路径

    ie下获取上传文件全路径,3.5之后的火狐是没法获取上传文件全路径的 /*获取上传文件路径*/ function getFilePath(obj) { var form = $(this).paren ...

  2. asp.net 客户端上传文件全路径获取方法

    asp.net  获取客户端上传文件全路径方法: eg:F:\test\1.doc 基于浏览器安全问题,浏览器将屏蔽获取客户端文件全路径的方法,只能获取到文件的文件名,如果需要获取全路径则需要另想其他 ...

  3. Atitit.js获取上传文件全路径

    Atitit.js获取上传文件全路径 1. 默认的value只能获取文件名..安全原因.. 1 2. Firefox浏览器的读取 1 3. Html5 的file api 2 4. 解决方法::使用a ...

  4. 20160620001 FileUpload控件获取上传文件的路径

    参考地址: http://bbs.csdn.net/topics/350051517 —————————————————————————————— 用js实现 <%@ Page Language ...

  5. 【django】本地开发media用户上传文件访问路径找不到

    当我们在本地开发的时候,会碰到static可以访问,但是用户上传的文件设置在media下不可访问怎么办?settings配置: 接着在你的urls文件添加: from . import setting ...

  6. SpringMVC上传文件后返回文件服务器地址路径

    先写一个表单: <%@ page language="java" contentType="text/html; charset=UTF-8" pageE ...

  7. input[type='file']获取上传文件路径案例

    最近在项目时,需要获取用户的上传文件的路径,便写了一个demo: <body> <input type="file" name="" valu ...

  8. 通过cmd完成FTP上传文件操作

    一直使用 FileZilla 这个工具进行相关的 FTP 操作,而在某一次版本升级之后,发现不太好用了,连接老是掉,再后来完全连接不上去. 改用了一段时间的 Web 版的 FTP 工具,后来那个页面也 ...

  9. FTP上传文件到服务器

    一.初始化上传控件. 1.我们这里用dropzone.js作为上传控件,下载地址http://www.dropzonejs.com/ 2.这里我们使用一个div元素作为dropzone载体. < ...

  10. Jmeter上传文件

    Jmeter上传文件 一.Fiddler抓包获取表单信息 操作被测系统,上传文件,Fiddler抓包获取提交表单信息如下:

随机推荐

  1. SQL通用语法和SQL分类

    SQL通用语法 1.SQL 语句可以单行或多行书写,以分号结尾 2.可使用空格和缩进来增强语句的可读性 3.MySQL 数据库的SQL语句不区分大小写,关键字建议使用大写 4.3种注释 单行注释: - ...

  2. 智能工厂的ERP和MES之间的区别?

    无论在哪里,ERP(Enterprise Resource Planning,企业资源计划)和MES(Manufacturing Execution System,即制造执行系统)系统都不是同样的东西 ...

  3. [题解] Codeforces 1720 E Misha and Paintings 结论

    题目 算是诈骗题? 令一开始就存在的颜色数为cnt.k>=cnt的情况,显然每次找一个出现不止一次的颜色,然后把这个颜色的恰好一个方块替换成一种没有出现过的颜色就可以了,\(k-cnt\)次解决 ...

  4. R及R Studio下载安装教程(超详细)

    R 语言是为数学研究工作者设计的一种数学编程语言,主要用于统计分析.绘图.数据挖掘. 如果你是一个计算机程序的初学者并且急切地想了解计算机的通用编程,R 语言不是一个很理想的选择,可以选择 Pytho ...

  5. react.js 实现音乐播放、下一曲、以及删除歌曲(仅播放列表)

    import React, { Component } from 'react'; export default class Music extends Component {   construct ...

  6. 魔改editormd组件,优化ToC渲染效果

    前言 我的StarBlog博客目前使用 editor.md 组件在前端渲染markdown文章,但这个组件自动生成的ToC(内容目录)不是很美观,我之前魔改过一个树形组件 BootStrap-Tree ...

  7. Linux基础_2_bash功能

    查看当前shell:echo  $SHELL 查看可用shell:cat  /etc/shells 命令行编辑 光标跳到行首:Ctrl+a 光标跳到行尾:Ctrl+e 以单词为单位快速跳转光标:Ctr ...

  8. Bob 的生存概率问题

    Bob 的生存概率问题 作者:Grey 原文地址: 博客园:Bob 的生存概率问题 CSDN:Bob 的生存概率问题 题目描述 给定五个参数 n , m , i , j , k,表示在一个 n*m 的 ...

  9. letcode刷题记录-day02-回文数

    回文数 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答 ...

  10. Python基础部分:3、 pycharm的下载与使用

    目录 pycharm下载与使用 一.软件说明 二.版本说明 三.如何免费使用正式版软件 四.pycharm运行空间 五.文件后缀名 六.安装pycharm工具 七.pycharm的基本配置和PY文件的 ...