最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用JsonConverter處理上傳文件的路徑問(wèn)題

 更新時(shí)間:2022年12月24日 09:06:26   作者:拉克斯文  
我們上傳一個(gè)文件,把文件保存到服務(wù)器上,會(huì)有一個(gè)明確的物理路徑,由于需要從前端訪問(wèn)這個(gè)文件,還需要web服務(wù)器中的一個(gè)虛擬路徑,我們可以使用JsonConverter 來(lái)自動(dòng)處理一下,這篇文章主要介紹了使用JsonConverter處理上傳文件的路徑,需要的朋友可以參考下

場(chǎng)景

我們上傳一個(gè)文件,把文件保存到服務(wù)器上,會(huì)有一個(gè)明確的物理路徑,由于需要從前端訪問(wèn)這個(gè)文件,還需要web服務(wù)器中的一個(gè)虛擬路徑。這個(gè)虛擬路徑的存儲(chǔ)會(huì)有一個(gè)問(wèn)題,我們應(yīng)該在數(shù)據(jù)庫(kù)里存什么?是帶域名的全路徑,還是相對(duì)于web根目錄的相對(duì)路徑?

現(xiàn)在很多架構(gòu)都是前后分離的,所以前端訪問(wèn)的url是全路徑比較好,不像之前前后都是一個(gè)項(xiàng)目中,數(shù)據(jù)庫(kù)存相對(duì)路徑,前端也使用相對(duì)路徑訪問(wèn)沒(méi)有問(wèn)題。
如果存全路徑,域名更換的時(shí)候就比較麻煩,需要手動(dòng)把數(shù)據(jù)庫(kù)里的數(shù)據(jù)替換一下。如果存相對(duì)路徑,返回前端的時(shí)候需要手動(dòng)的補(bǔ)全路徑,也不是太好。

解決方法

我們可以使用JsonConverter 來(lái)自動(dòng)處理一下,具體方法是保存相對(duì)路徑,返回的時(shí)候自動(dòng)加上前綴組成全路徑。

/// <summary>
/// 處理圖片文件前綴,數(shù)據(jù)庫(kù)中存相對(duì)路徑即可
/// </summary>
public class JsonUrlPrefixConverter : JsonConverter
{
    private string urlPrefix;
    public JsonUrlPrefixConverter()
    {
        urlPrefix ="htttp://www.abc.com"; //這里前綴可以做成配置,換域名時(shí)改一下配置即可
    }

    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)
    {
        //請(qǐng)自覺(jué)用于 string[]、string、List<string>類型
        return true;
    }
}

使用

JsonUrlPrefixConverter 使用了 Newtonsoft.Json,所以在新的 dotnet 項(xiàng)目中需要指定一下序列話還使用 Newtonsoft.Json。

builder.Services.AddControllers()
.AddNewtonsoftJson(options =>
{
    //忽略循環(huán)引用問(wèn)題
    options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});

然后在上傳路徑的字段上加JsonUrlPrefixConverter 便可以自動(dòng)處理。
如頭像字段:

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

如前端保存時(shí)傳給后端的是 "http://www.abc.com/upload/avatar.jpg" ,經(jīng)過(guò) JsonUrlPrefixConverter 處理,會(huì)得到 "/upload/avatar.jpg" 保存到數(shù)據(jù)庫(kù),當(dāng)從后端返回到前端的時(shí)候,會(huì)自動(dòng)加上前綴,又變成了 "http://www.abc.com/upload/avatar.jpg" 。
這樣如果域名變了,修改一下配置的前綴即可。

到此這篇關(guān)于使用JsonConverter處理上傳文件的路徑的文章就介紹到這了,更多相關(guān)JsonConverter處理上傳文件的路徑內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

永兴县| 衡阳市| 长阳| 瑞昌市| 新巴尔虎左旗| 乐陵市| 阜南县| 渝北区| 金秀| 卢湾区| 金山区| 保德县| 泗洪县| 绥滨县| 喀喇| 城固县| 双峰县| 永兴县| 邵阳县| 凤凰县| 浮山县| 三原县| 来凤县| 镇原县| 柘城县| 湘乡市| 盐山县| 嘉兴市| 蓝田县| 建湖县| 古丈县| 体育| 商城县| 泾阳县| 封丘县| 密山市| 双桥区| 同心县| 厦门市| 黄大仙区| 泗阳县|