linux部署.net core api並且實現上傳圖片

来源:https://www.cnblogs.com/MrHanBlog/archive/2019/06/21/11063643.html
-Advertisement-
Play Games

為了體驗.net在linux上運行,所以使用HttpClient東借西抄做了一個簡單的api上傳功能。 第一步,簡單的上傳功能: 然後自己再寫一個api程式做為服務端用來接收請求,如下代碼: api程式記得修改Program.cs 當時我訪問出現502就是因為這個原因 然後本地測試可以之後再將api ...


為了體驗.net在linux上運行,所以使用HttpClient東借西抄做了一個簡單的api上傳功能。

第一步,簡單的上傳功能:

  

 public class UploadHelper
    {
        private static readonly string controller = "/api/Upload";
        /// <summary>
        /// 使用HttpClient上傳附件
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        public static async Task<string> Upload(string filePath)
        {
            FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
            HttpContent httpContent = new StreamContent(fileStream);
            httpContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");
            string filename = filePath.Substring(filePath.LastIndexOf("\\") + 2);
            NameValueCollection nameValueCollection = new NameValueCollection();
            nameValueCollection.Add("user-agent", "User-Agent    Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; MALNJS; rv:11.0) like Gecko");
            using (MultipartFormDataContent mulContent = new MultipartFormDataContent("----WebKitFormBoundaryrXRBKlhEeCbfHIY"))
            {
                mulContent.Add(httpContent, "file", filename);
                string ip = ConfigurationProvider.configuration.GetSection("webapi:HttpAddresss").Value;
                string url = "http://"+ip + controller;
                return await HttpHelper.PostHttpClient(url, nameValueCollection, mulContent);
            }

        }
    }
 public class HttpHelper
    {
        /// <summary>
        /// httpclient post請求
        /// </summary>
        /// <param name="url"></param>
        /// <param name="RequestHeaders"></param>
        /// <param name="multipartFormDataContent"></param>
        /// <returns></returns>
        public  static async Task<string>  PostHttpClient(string url, NameValueCollection RequestHeaders,
             MultipartFormDataContent multipartFormDataContent)
        {
            var handler = new HttpClientHandler();
            handler.ServerCertificateCustomValidationCallback = delegate { return true; };
            using (HttpClient client = new HttpClient(handler))
            {
                client.MaxResponseContentBufferSize = 256000;
                client.DefaultRequestHeaders.Add(RequestHeaders.Keys[0],RequestHeaders[RequestHeaders.Keys[0]]);
                HttpResponseMessage httpResponseMessage = await client.PostAsync(url, multipartFormDataContent);
                httpResponseMessage.EnsureSuccessStatusCode();
                string result = httpResponseMessage.Content.ReadAsStringAsync().Result;
                return result;
            }
        }
    }

然後自己再寫一個api程式做為服務端用來接收請求,如下代碼:

    [Route("api/[controller]")]
    [ApiController]
    public class UploadController : ControllerBase
    {
        private IHostingEnvironment hostingEnvironment;
        public UploadController(IHostingEnvironment _hostingEnvironment)
        {
            hostingEnvironment = _hostingEnvironment;
        }
        [HttpPost]
        public IActionResult Upload()
        {
            try
            {
                var imgFile = Request.Form.Files[0];
                int index = imgFile.FileName.LastIndexOf('.');
                //獲取尾碼名
                string extension = imgFile.FileName.Substring(index, imgFile.FileName.Length - index);
                string webpath = hostingEnvironment.ContentRootPath;
                string guid = Guid.NewGuid().ToString().Replace("-", "");
                string newFileName = guid + extension;
                DateTime dateTime = DateTime.Now;
                //linux環境目錄為/{1}/
                string path = string.Format(@"{0}/TemporaryFile/{1}/{2}/{3}", "/home/www", dateTime.Year.ToString(), dateTime.Month.ToString()
                    , dateTime.Day.ToString());
                if (!Directory.Exists(path))
                    Directory.CreateDirectory(path);
                string imgSrc = path + @"/" + newFileName;
                using (FileStream fs = System.IO.File.Create(imgSrc))
                {
                    imgFile.CopyTo(fs);
                    fs.Flush();
                }
                return new JsonResult(new { message = "OK", code = 200 });
            }
            catch (Exception e)
            {
                return new JsonResult(new {message=e.Message,code=500});
            }
        }

api程式記得修改Program.cs

 

  public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }
         //本地啟動
        //public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        //    WebHost.CreateDefaultBuilder(args).UseUrls("http://*:5000")
        //        .UseStartup<Startup>();
        //linux啟動
        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>();
    }

當時我訪問出現502就是因為這個原因

然後本地測試可以之後再將api部署到linux伺服器,部署linux需要一下工具:

 XFTP:將發佈好的api程式傳到linux,

Ngnix:反向代理,參考菜鳥教程https://www.runoob.com/linux/nginx-install-setup.html,我的配置是這個,記得將5000加入防火牆,並且網路策略這個埠:

user www www;
worker_processes 2; #設置值和CPU核心數一致
error_log /usr/local/webserver/nginx/logs/nginx_error.log crit; #日誌位置和日誌級別
pid /usr/local/webserver/nginx/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535;
events
{
  use epoll;
  worker_connections 65535;
}
http
{
 
 #下麵是server虛擬主機的配置
        server {
    listen 80;
    location / {
        proxy_pass http://localhost:5000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection keep-alive;
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

}

具體的部署過程網上很多教程。部署好之後就可以試著用postman或瀏覽器輸入地址訪問了。

因為linux的機制當你退出linux後就無法訪問,所以需要配置進程守護,我的配置如下

[program:BlogApi]
command=dotnet BlogApi.dll
directory=/home/wwwroot/BlogAPI/
stderr_logfile=/var/log/BlogApi.error.log
stdout_logfile=/var/log/BlogApi.stdout.log
environment=ASPNETCORE_ENVIRONMENT=Production
user=root
stopsignal=INT
autostart=true
autorestart=true
startsecs=3

更新重啟守護進程,然後你就可以隨時隨地訪問了,

 

打個廣告:游戲也能賺錢?如果你熱愛游戲,並且想通過游戲贏得零花錢,5173是個不錯的選擇  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 容器可設置佈局管理器,管理容器中組件的佈局: container.setLayout(new XxxLayout()); Java有6種佈局管理器,AWT提供了5種: FlowLayout BorderLayout GridLayout GridBagLayout CradLayout Swing還 ...
  • Github https://github.com/gongluck/SDL2 study/tree/master/Csdl2 Csdl2.h Csdl2.cpp 測試 C++ include "Csdl2.h" include include include define TESTCHECKRET ...
  • 讓我們考慮一個簡單的編程挑戰:對大數組中的所有元素求和。現在可以通過使用並行性來輕鬆優化這一點,特別是對於具有數千或數百萬個元素的巨大陣列,還有理由認為,並行處理時間應該與常規時間除以CPU核心數一樣多。事實證明,這一壯舉並不容易實現。我將向您展示幾種並行執行此操作的方法,它們如何改善或降低性能以及 ...
  • 在前面兩篇隨筆《ABP開發框架前後端開發系列---(7)系統審計日誌和登錄日誌的管理》和《ABP開發框架前後端開發系列---(8)ABP框架之Winform界面的開發過程》開始介紹了許可權管理的內容,其中只是列出了內部的許可權系統的審計和登陸信息,以及對Winform界面的整合,本篇隨筆繼續介紹ABP開... ...
  • 軟體開發中最常用的模式之一是緩存,這是一個簡單但非常有效的概念,想法是重用操作結果,執行繁重的操作時,我們會將結果保存在緩存容器中,下次我們需要該結果時,我們將從緩存容器中取出它,而不是再次執行繁重的操作。 例如,要獲得某人的頭像,您可能需要前往資料庫。我們不會每次都執行那次查詢,而是將結果保存在緩 ...
  • 在上一篇文章中學習了ABP的倉儲(Repository)功能,Repository對資料庫進行增刪改查操作。在這一篇文章中我們主要瞭解應用服務層。 應用服務用於將領域(業務)邏輯暴露給展現層。展現層通過傳入DTO(數據傳輸對象)參數來調用應用服務,而應用服務通過領域對象來執行相應的業務邏輯並且將DT... ...
  • 微軟從C#1.0的委托,到C#2.0的匿名方法,再到C#3.0的Lambda表達式,一步步升級,帶給我們的是代碼上的優美,簡潔,可讀性強。Lambda 表達式廣泛用於編寫LINQ查詢表達式等方面。本文全面的介紹了Lambda 表達式的概念、由來及使用方法。 ...
  • 使用Process.Start(new ProcessStartInfo(url))來打開某一網址的時候,往往會被360提示 類似這樣的 信息: “威脅:修改此註冊表項將更改IE連接設置。少數軟體會修改此項,如果隨意修改,可能造成無法上網。如果您不認識此程式,請阻止。” 這是由於 360 會判斷啟動 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...