欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用JsonConverter處理上傳文件的路徑問題

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

場景

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

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

解決方法

我們可以使用JsonConverter 來自動處理一下,具體方法是保存相對路徑,返回的時候自動加上前綴組成全路徑。

/// <summary>
/// 處理圖片文件前綴,數(shù)據(jù)庫中存相對路徑即可
/// </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 =>
{
    //忽略循環(huán)引用問題
    options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
});

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

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

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

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

相關文章

  • C#使用kernel32.dll讀寫INI文件的案例詳解

    C#使用kernel32.dll讀寫INI文件的案例詳解

    INI就是擴展名為"INI"的文件,其實他本身是個文本文件,可以用記事本打開,主要存放的是用戶所做的選擇或系統(tǒng)的各種參數(shù),這篇文章主要介紹了C#使用kernel32.dll讀寫INI文件的方法,需要的朋友可以參考下
    2023-05-05
  • Unity實現(xiàn)游戲卡牌滾動效果

    Unity實現(xiàn)游戲卡牌滾動效果

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)游戲卡牌滾動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • c#基礎之數(shù)組與接口使用示例(遍歷數(shù)組 二維數(shù)組)

    c#基礎之數(shù)組與接口使用示例(遍歷數(shù)組 二維數(shù)組)

    本文主要介紹了c#基礎知識中的數(shù)組與接口使用方法,結合示例,大家一看就明白
    2014-01-01
  • C#中const和readonly的用法比較

    C#中const和readonly的用法比較

    今天小編就為大家分享一篇關于C#中const和readonly的用法比較,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • 詳解.NET 6如何實現(xiàn)獲取當前登錄用戶信息

    詳解.NET 6如何實現(xiàn)獲取當前登錄用戶信息

    這篇文章主要介紹了.NET 6在應用開發(fā)時是如何實現(xiàn)當前登陸用戶信息獲取的,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-01-01
  • C#設置Word文本框中改變文字方向的方法

    C#設置Word文本框中改變文字方向的方法

    在Word中可插入文本框,默認情況下插入的文本框中的文字方向為橫向排列,對于一些特殊文檔的設計要求,需要改變文字方向,本文就詳細的介紹一下使用,感興趣的可以了解一下
    2021-06-06
  • Unity實現(xiàn)汽車前后輪倒車軌跡計算

    Unity實現(xiàn)汽車前后輪倒車軌跡計算

    這篇文章主要為大家詳細介紹了Unity實現(xiàn)汽車前后輪倒車軌跡計算,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C#解決漢諾塔問題DEMO

    C#解決漢諾塔問題DEMO

    這篇文章主要介紹了C#解決漢諾塔問題DEMO,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下
    2015-05-05
  • C#獲取全部目錄和文件的簡單實例

    C#獲取全部目錄和文件的簡單實例

    這篇文章介紹了C#獲取全部目錄和文件的簡單實例,有需要的朋友可以參考一下
    2013-10-10
  • c# Winform自定義控件-儀表盤功能

    c# Winform自定義控件-儀表盤功能

    這篇文章主要介紹了c#Winform自定義控件-儀表盤功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09

最新評論