为了体验.net在linux上运行,所以使用HttpClient东借西抄做了一个简单的api上传功能。第一步,简单的上传功能: public class UploadHelper{private static readonly string controller = /api/Upload;/// su...
为了体验.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是个不错的选择 http://www.5173.com/?recommenduserid=US15061749098191-04F6
本文标题为:linux部署.net core api并且实现上传图片
基础教程推荐
- unity实现动态排行榜 2023-04-27
- linux – 如何在Debian Jessie中安装dotnet core sdk 2023-09-26
- C# 调用WebService的方法 2023-03-09
- C#类和结构详解 2023-05-30
- winform把Office转成PDF文件 2023-06-14
- ZooKeeper的安装及部署教程 2023-01-22
- C# List实现行转列的通用方案 2022-11-02
- 一个读写csv文件的C#类 2022-11-06
- C#控制台实现飞行棋小游戏 2023-04-22
- C# windows语音识别与朗读实例 2023-04-27