软件编程
位置:首页>> 软件编程>> C#编程>> C# WinForm自动更新程序之文件上传操作详解

C# WinForm自动更新程序之文件上传操作详解

作者:Csharp小记  发布时间:2022-09-11 21:42:11 

标签:C#,WinForm,更新,程序

前言

更新都写完了,但是要更新文件要怎么操作呢?连接服务器然后上传上去,修改下xml的版本号当然也是可以的,但是还是没有写个程序使用起来方便,所以这一篇就写一个简单的上传程序。后台依然是使用的.net core webapi,然后新建个控制器来接收上传来的文件。前台就直接使用layui随便搭个上传表单。

C# WinForm自动更新程序之文件上传操作详解

开发环境

.NET Core 3.1

开发工具

Visual Studio 2019

实现代码


//控制器代码
namespace AutoUpdate.WebApi.Controllers {
   [Route("api/[controller]")]
   [ApiController]
   public class UploadController : ControllerBase {
       private static object obj = new object();

[HttpPost]
       public JsonResult Upload() {

IFormFileCollection formFile = Request.Form.Files;
           if(formFile.Count == 0) {
               throw new Exception("没有文件");
           }

ReturnResult result = new ReturnResult(Result.success);
           string path = AppContext.BaseDirectory + "files\\";
           string xmlPath = AppContext.BaseDirectory + "UpdateList.xml";
           try {
               foreach(var file in formFile) {
                   string fileName = path + file.FileName;
                   using FileStream fileStream = System.IO.File.Create(fileName);
                   file.CopyTo(fileStream);
                   fileStream.Flush();
               }

List<string> UpdateFiles = formFile.Select(s => s.FileName).ToList();
               UpdateXml(UpdateFiles);
           }
           catch(Exception ex) {
               result.result = Result.error;
               result.msg = ex.Message;
           }
           return new JsonResult(result);
       }
       private void UpdateXml(List<string> UpdateFiles) {
           lock(obj) {
               string xmlPath = AppContext.BaseDirectory + "UpdateList.xml";
               XDocument xdoc = XDocument.Load(xmlPath);
               foreach(string file in UpdateFiles) {
                   var ele_files = xdoc.Root.Element("files");

XElement xele = ele_files.Elements().FirstOrDefault(s => s.Attribute("name").Value == file);
                   if(xele != null) {
                       string oldVer = xele.Attribute("version").Value;
                       xele.SetAttributeValue("version", Math.Round(decimal.Parse(oldVer) + (decimal)0.01, 2));
                   }
                   else {
                       XElement addXele = new XElement("file");
                       addXele.SetAttributeValue("name", file);
                       addXele.SetAttributeValue("version", "1.00");
                       ele_files.Add(addXele);
                   }
               }
               xdoc.Save(xmlPath);
           }
       }
   }
}

//html代码
<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8" />
   <title>文件更新</title>
   <link rel="stylesheet" href="./layui/css/layui.css" rel="external nofollow" >
</head>
<body>
   <div class="layui-form-item" style="margin:15%">
       <div class="layui-col-md10 layui-col-xs9 layui-form-item-mt5">
           <label class="layui-form-label">文件上传</label>
           <div class="layui-input-block">
               <input type="text" id="filename" name="filename" class="layui-input" readonly />
           </div>
       </div>
       <div class="layui-col-md2 layui-col-xs1 layui-form-item-mt5">
           <button class="layui-btn" id="btnBrowse">浏览</button>
           <button class="layui-btn" id="submit" lay-filter="submit" lay-submit>上传</button>
       </div>
   </div>
   <script src="./layui/layui.js"></script>
   <script>
       var layer = layui.layer, form = layui.form, $ = layui.jquery,
           upload = layui.upload;

form.render();
       upload.render({
           elem: '#btnBrowse'
           , url: 'http://localhost:5000/api/Upload'
           , headers: {}
           , data: {}
           , accept: 'file'
           , multiple: true
           , auto: false
           , bindAction: '#submit'
           , choose: function (obj) {
               $("#filename").val("");
               obj.preview(function (index, file, result) {
                   $("#filename").val($("#filename").val() + file.name + " ; ");
               })
           }
           , done: function (res, index, upload) {
               layer.closeAll('loading');
               layer.msg(res.msg);
           },
           error: function (res) {
               layer.closeAll('loading');
           }
       })
</script>
</body>
</html>

实现效果

C# WinForm自动更新程序之文件上传操作详解

代码解析:

文件上传完之后,若xml文件中已经存在该文件名称,则进行版本+0.01,否则新加一条节点信息,默认版本号为1.00。然后这里由于要操作文件,所以又加了个锁来防止占用(总觉得这个方式不太合适),主要是因为layui的多文件上传是循环调接口实现的,感觉不太好,建议使用其他框架或者对js代码进行更改。

来源:https://mp.weixin.qq.com/s/LKabsXQfQeTKSb-GifmDSw

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com