首頁 > 軟體

C# WinForm自動更新程式之檔案上傳操作詳解

2022-10-23 18:00:33

前言

更新都寫完了,但是要更新檔案要怎麼操作呢?連線伺服器然後上傳上去,修改下xml的版本號當然也是可以的,但是還是沒有寫個程式使用起來方便,所以這一篇就寫一個簡單的上傳程式。後臺依然是使用的.net core webapi,然後新建個控制器來接收上傳來的檔案。前臺就直接使用layui隨便搭個上傳表單。

開發環境

.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>

實現效果

程式碼解析:

檔案上傳完之後,若xml檔案中已經存在該檔名稱,則進行版本+0.01,否則新加一條節點資訊,預設版本號為1.00。然後這裡由於要操作檔案,所以又加了個鎖來防止佔用(總覺得這個方式不太合適),主要是因為layui的多檔案上傳是迴圈調介面實現的,感覺不太好,建議使用其他框架或者對js程式碼進行更改。

到此這篇關於C# WinForm自動更新程式之檔案上傳操作詳解的文章就介紹到這了,更多相關C# WinForm自動更新程式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com


IT145.com E-mail:sddin#qq.com