C# WinForm自动更新程序之文件上传操作详解
作者:Csharp小记 发布时间:2022-09-11 21:42:11
标签:C#,WinForm,更新,程序
前言
更新都写完了,但是要更新文件要怎么操作呢?连接服务器然后上传上去,修改下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代码进行更改。
来源:https://mp.weixin.qq.com/s/LKabsXQfQeTKSb-GifmDSw
0
投稿
猜你喜欢
- 本文实例分析了C#反射内存的处理。分享给大家供大家参考。具体分析如下:这段时间由于公司的项目的要求,我利用c#的反射的机制做了一个客户端框架
- 笔者计划为大家介绍分布式文件系统,用于存储应用的图片、word、excel、pdf等文件。在开始介绍分布式文件系统之前,为大家介绍一下使用本
- BufferedInputStream BufferedInputStream 是缓冲输入流。它继承于FilterInputSt
- MyBatis-Generator自动生成映射文件生成的方式一共有三种1、使用cmd命令方式生成首先在generator.xml中指定数据库
- 前言我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.concurrent包的核心,没有volat
- 本文实例为大家分享了C#导出Excel的具体代码,供大家参考,具体内容如下using System;using System.Collect
- 1、首先 当然是启动genymotion2、然后Tomcat ,启动tomcat。。如图将请求的URL地址变为10.0.3.2 ,比如在电脑
- 前言之前做移动端开发,都不清楚WebService是啥东东,现在接触c#,项目中有三处WebService调用,就不得不与其打交道了,最近碰
- using System;using System.Collections;using System.IO;namespace Consol
- Java 8新增了LocalDate和LocalTime接口,为什么要搞一套全新的处理日期和时间的API?因为旧的java.util.Dat
- Jetty是一个轻量级的高度可扩展的基于 java的web服务器和servlet引擎。下面是 使用 Intellij IDEA 的maven
- PrintStream 介绍PrintStream 是打印输出流,它继承于FilterOutputStream。PrintStream 是用
- 1. 为什么要使用线程池使用线程池通常由以下两个原因:频繁创建销毁线程需要消耗系统资源,使用线程池可以复用线程。使用线程池可以更容易管理线程
- 碎片的创建要使用碎片先要创建一个碎片,创建一个碎片很简单。1.新建一个碎片布局,fragment.xml<?xml version=&
- 前言这篇文章主要介绍Spring Boot的统一功能处理模块,也是AOP的实战环节。1.用户登录权限效验在学习Spring AOP之前,用户
- 目录概述&选型单机安装配置双机主从高可用搭建启动多个NameServer 和 Broker重要参数说明可视化管理平台SpringBo
- 目录为什么要实现调用链跟踪?如何实现?第一步,看图、看场景,用户浏览器的一次请求行为所走的路径是什么样的第二步,实现。不想看代码可直接拉最后
- 前言MongoDB是一款由C++编写的高性能、开源、无模式的常用非关系型数据库产品,是非关系数据库当 * 能最丰富、最像关系数据库的数据库。它
- 前言在实际工作中,重处理是一个非常常见的场景,比如:发送消息失败。调用远程服务失败。争抢锁失败。这些错误可能是因为网络波动造成的,等待过后重
- 导出的 Jar 包无法运行?导出的 Jar 包找不到 Main class?大概是我对导出 Jar 包的理解不深吧,反正一直不太懂 IDEA