win10 uwp 使用 asp dotnet core 做图床服务器客户端
原文 win10 uwp 使用 asp dotnet core 做图床服务器客户端
本文告诉大家如何在 UWP 做客户端和 asp dotnet core 做服务器端来做一个图床工具
服务器端
从 win10 uwp 手把手教你使用 asp dotnet core 做 cs 程序 可以了解一个简单的 asp dotnet core 程序是如何搭建,下面来告诉搭建如何做一个简单的图床服务器
注意本文提供的方式不能用在正式的项目,只能在自己玩的项目使用。
创建数据库
为了简单,本文就使用内存做数据库
打开 Startup 的 ConfigureServices 方法,替换为下面代码
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddDbContext<KehallzorDralnaContext>(options =>
options.UseInMemoryDatabase("DihoostaDanarSouser"));
这样就可以使用内存数据库
创建模型
首先创建一个 asp dotnet core 项目,然后添加一个模型
public class XaseYinairtraiSeawhallkou
{
public int Id { get; set; }
public string Name { get; set; }
public string File { get; set; }
}
这个模型就是用来创建图片使用的,上传图片就调用这个类,包括了文件的文件名和文件
创建控制器
通过右击添加控制器的方法添加一个控制器,控制器需要选使用 EF 的 API 控制器
接下来就是选择刚才模型创建控制器
添加上传下载代码
打开创建的控制器,添加上传和下载的代码,上传的代码很简单,需要用到 post 的方式
[HttpPost("UploadFile")]
public string UploadFile([FromForm]CukaiZexiridror rarmelHopidrearLis)
- 1
- 2
这里有一个细节是参数 rarmelHopidrearLis 是从 Form 拿到,这样就需要在 UWP 程序使用 MultipartFormDataContent 的方法上传,这里的 CukaiZexiridror 类包含了两个属性,一个是 Name 一个是上传的文件
public class CukaiZexiridror
{
public IFormFile File { set; get; }
public string Name { get; set; }
}
这里的 MultipartFormDataContent 的内容需要包含一个 string 内容和一个 Stream 内容,还需要设置对应的 Name 请看本文下方的方法
在调用方法拿到 rarmelHopidrearLis 可以访问本地的一个文件夹,然后将文件写入这个文件夹
var nefaycisirJisrea = Directory.GetCurrentDirectory();
var demmiraWurrupooHasur = Path.Combine(nefaycisirJisrea, "Image");
上面代码使用 GetCurrentDirectory 拿到一个文件夹,这个项目不发了用在实际使用的一个原因就是这里拿到的文件夹建议是管理起来,而不是直接拿到一个文件夹。
这里先判断是否存在文件夹,如果文件夹不存在,就创建文件夹
if (!Directory.Exists(demmiraWurrupooHasur))
{
Directory.CreateDirectory(demmiraWurrupooHasur);
}
判断是否存在文件,如果存在文件就将这个文件删除,当然这样做只是在玩的时候可以这样写
var gowkusayJomalltrur = Path.Combine(demmiraWurrupooHasur, rarmelHopidrearLis.Name);
if (System.IO.File.Exists(gowkusayJomalltrur))
{
System.IO.File.Delete(gowkusayJomalltrur);
}
从上传的文件写入到服务器可以使用下面代码,这里的 IFormFile 提供了 CopyTo 可以复制到一个 Stream 调用这个方法就可以让用户创建文件,但是这个方法也有一个问题就是不支持断点续传,同时也不支持大的文件
using (var massesuhouHarle = new FileStream(gowkusayJomalltrur, FileMode.Create))
{
rarmelHopidrearLis.File.CopyTo(massesuhouHarle);
}
很简单的代码就可以保存用户上传的文件,下面就是需要保存文件的路径
将文件的路径写入到数据库
_context.XaseYinairtraiSeawhallkou.Add(new XaseYinairtraiSeawhallkou()
{
File = gowkusayJomalltrur,
Name = rarmelHopidrearLis.Name
});
_context.SaveChanges();
现在的上传的代码
[HttpPost("UploadFile")]
public string UploadFile([FromForm]CukaiZexiridror rarmelHopidrearLis)
{
var nefaycisirJisrea = Directory.GetCurrentDirectory();
var demmiraWurrupooHasur = Path.Combine(nefaycisirJisrea, "Image");
if (!Directory.Exists(demmiraWurrupooHasur))
{
Directory.CreateDirectory(demmiraWurrupooHasur);
}
var gowkusayJomalltrur = Path.Combine(demmiraWurrupooHasur, rarmelHopidrearLis.Name);
if (System.IO.File.Exists(gowkusayJomalltrur))
{
System.IO.File.Delete(gowkusayJomalltrur);
}
using (var massesuhouHarle = new FileStream(gowkusayJomalltrur, FileMode.Create))
{
rarmelHopidrearLis.File.CopyTo(massesuhouHarle);
}
_context.XaseYinairtraiSeawhallkou.Add(new XaseYinairtraiSeawhallkou()
{
File = gowkusayJomalltrur,
Name = rarmelHopidrearLis.Name
});
_context.SaveChanges();
return "上传完成";
}
上传的代码很简单,同时下载的代码就更加简单,核心就是通过 File 方法返回
在服务器的下载代码是通过 get 的方法
[HttpGet("DownLoadFile")]
public IActionResult DownLoadFile(string fileName)
只要有文件名,所有人都可以下载,本文不告诉大家如何做用户权限
下载的时候使用文件名从数据库找,如果找到了,就判断是否存在这个文件,如果存在就返回
[HttpGet("DownLoadFile")]
public IActionResult DownLoadFile(string fileName)
{
var demmiraWurrupooHasur =
_context.XaseYinairtraiSeawhallkou.FirstOrDefault(xileQawkirXeafis =>
xileQawkirXeafis.Name == fileName)?.File;
if (string.IsNullOrEmpty(demmiraWurrupooHasur))
{
return NotFound();
}
if (System.IO.File.Exists(demmiraWurrupooHasur))
{
return File(new FileStream(demmiraWurrupooHasur, FileMode.Open), "image/png");
}
return NotFound();
}
这里通过 File 方法返回,需要告诉用户当返回的content-type
这里不是实际的项目,所以返回的都是 png 图片
客户端
首先打开 VisualStudio 新建一个 UWP 项目,可以基于 10240 或者其他的。
然后在界面添加两个按钮,一个按钮是点击上传文件,另一个按钮是点击下载文件
在点击上传文件的代码,先让用户选择一张图片
var lisNailallkear = new FileOpenPicker()
{
FileTypeFilter =
{
".png"
}
};
var whejowNoukiru = await lisNailallkear.PickSingleFileAsync();
然后将图片转换为流
async Task<Stream> GetFile()
{
var lisNailallkear = new FileOpenPicker()
{
FileTypeFilter =
{
".png"
}
};
var whejowNoukiru = await lisNailallkear.PickSingleFileAsync();
return await whejowNoukiru.OpenStreamForReadAsync();
}
通过 MultipartFormDataContent 发送到服务器,这里使用 MultipartFormDataContent 是因为需要发送文件名和文件,通过下面的代码可以添加文件名
var casnisHoubou = new MultipartFormDataContent();
var taykiHerniCeawerenel = new StringContent("文件名");
casnisHoubou.Add(taykiHerniCeawerenel, "Name");
这里就将文件名写为文件名,通过 MultipartFormDataContent 添加,加入的时候注意添加名字
然后使用 StreamContent 添加文件
var henocoRowrarlarVegonirnis = await GetFile();
var tobemmanuCamuCaivi = new StreamContent(henocoRowrarlarVegonirnis);
casnisHoubou.Add(tobemmanuCamuCaivi, "File", "BardelCairdallChodiMestebarnai");
通过 URL 的方法 Post 创建的 casnisHoubou 就可以将文件上传到服务器
var rejairJate = new HttpClient();
var sairlallilarRaibedoYertousebow = "http://localhost:62435/api/XaseYinairtraiSeawhallkous/";
var casnisHoubou = new MultipartFormDataContent();
var taykiHerniCeawerenel = new StringContent("文件名");
casnisHoubou.Add(taykiHerniCeawerenel, "Name");
var henocoRowrarlarVegonirnis = await GetFile();
var tobemmanuCamuCaivi = new StreamContent(henocoRowrarlarVegonirnis);
casnisHoubou.Add(tobemmanuCamuCaivi, "File", "BardelCairdallChodiMestebarnai");
try
{
var tizicheLouru =
await rejairJate.PostAsync(sairlallilarRaibedoYertousebow + "UploadFile", casnisHoubou);
}
catch (Exception exception)
{
Debug.WriteLine(exception);
}
async Task<Stream> GetFile()
{
var lisNailallkear = new FileOpenPicker()
{
FileTypeFilter =
{
".png"
}
};
var whejowNoukiru = await lisNailallkear.PickSingleFileAsync();
return await whejowNoukiru.OpenStreamForReadAsync();
}
注意在自己的项目的时候需要在服务器端右击属性调试,替换上面的 URL 链接
一般只需要修改端口就可以
下载文件
现在来尝试加上下载文件的代码
先构造 URL 从服务器的代码可以知道,需要调用 DownLoadFile 传入参数,这里的端口请使用自己的项目的端口
var sairlallilarRaibedoYertousebow = "http://localhost:62435/api/XaseYinairtraiSeawhallkous/DownLoadFile?fileName=文件名";
下载的代码很简单
var rejairJate = new HttpClient();
var sairlallilarRaibedoYertousebow = "http://localhost:62435/api/XaseYinairtraiSeawhallkous/DownLoadFile?fileName=文件名";
保存到应用程序的临时文件夹
var husasLana = await ApplicationData.Current.TemporaryFolder.CreateFileAsync("1.png",CreationCollisionOption.ReplaceExisting);
using (var cairKeredoNukall = await husasLana.OpenStreamForWriteAsync())
{
qarJorfis.CopyTo(cairKeredoNukall);
}
从上面的代码可以看到,保存到一个 1.png 文件,但是这个文件相对比较难打开,可以使用下面代码打开
await Launcher.LaunchFileAsync(husasLana);
现在尝试先运行服务器端然后再运行客户端,可以看到点击上传和下载都是可以使用
这就是一个简单的使用 asp dotnet core 做文件服务器,但是这个服务器离实际可以使用的服务器还很远,本文只是告诉大家一个简单的方法。
代码 win10 uwp 使用 asp dotnet core 做图床服务器客户端-CSDN下载
参考
.NET Core 文件的上传与下载 - Degalo - 博客园
Upload/Download Files in ASP.NET Core 2.0 - CodeProject
我搭建了自己的博客 https://lindexi.gitee.io/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新
win10 uwp 使用 asp dotnet core 做图床服务器客户端的更多相关文章
- 2018-10-31-win10-uwp-使用-asp-dotnet-core-做图床服务器客户端
title author date CreateTime categories win10 uwp 使用 asp dotnet core 做图床服务器客户端 lindexi 2018-10-31 14 ...
- win10 uwp 手把手教你使用 asp dotnet core 做 cs 程序
本文是一个非常简单的博客,让大家知道如何使用 asp dot net core 做后台,使用 UWP 或 WPF 等做前台. 本文因为没有什么业务,也不想做管理系统,所以看到起来是很简单. Visua ...
- ASP.NET CORE做的网站运行在docker实践
用VS2017 建立了 DotNet Core 2.2 的网站后,如何转移到 Docker 下运行? 下面分两种方式来实践: 1.直接手动命今行,将本机目录映射进Docker,运行网站.2.制作 Im ...
- asp dotnet core 通过图片统计 csdn 用户访问
在 csdn 的访问统计里面,只能用 csdn 提供的访问统计,因为在 csdn 中不支持在博客加上 js 代码,也就是无法使用友盟等工具统计. 通过在 asp dotnet core 创建一个图片链 ...
- 牛腩学ASP.NET CORE做博客(视频)
牛腩学习ASP.NET CORE做的项目,边学边做. 目录: 01-dotnetcore网站部署到centos7系统上(时长 2:03:16) 02-前期准备及项目搭建 (时长:0:23:35) 03 ...
- asp dotnet core 支持客户端上传文件
本文告诉大家如何在 asp dotnet core 支持客户端上传文件 新建一个 asp dotnet core 程序,创建一个新的类,用于给客户端上传文件的信息 public class Kanaj ...
- asp.net core 系列 18 web服务器实现
一. ASP.NET Core Module 在介绍ASP.NET Core Web实现之前,先来了解下ASP.NET Core Module.该模块是插入 IIS 管道的本机 IIS 模块(本机是指 ...
- QiniuUpload- 一个方便用七牛做图床然后插入markdown的小工具
最近一段时间有用markdown做笔记,其他都好,但是markdown插入图片挺麻烦的,特别是想截图之后直接插入的时候.需要首先把图片保存了,然后还要上传到一个地方生成链接才能插入.如果有个工具可以直 ...
- [python] 溜了,溜了,七牛云图片资源批量下载 && 自建图床服务器
故事背景: 七牛云最近一波测试域名操作真是把我坑死了!这简直和百度赠送你2T网盘,之后再限速一样骚操作.于是,痛定思痛自己买个云主机.自己搭图床应用! 1.七牛图片批量下载到本地 1.1 曲折尝试 当 ...
随机推荐
- storm集群操作指南
目录 storm集群操作指南 一.storm伪分布式安装 (一)环境准备 (二)安装zookeeper (三)安装storm (四)运行程序 二.storm集群安装 (一)下载storm并解压 (二) ...
- php中的转义字符(用反斜杠\来输出,和C语言一样)
php中的转义字符(用反斜杠\来输出,和C语言一样) 一.总结 1.引号中的变量:双引号会替换变量的值,而单引号会把它当做字符串输出. 2.引号中的转义字符:双引号将用变量的值(test)代替它的名称 ...
- Gora快速入门 分类: C_OHTERS 2015-01-30 09:55 465人阅读 评论(0) 收藏
概述 Gora是apache的一个开源项目. The Apache Gora open source framework provides an in-memory data model and pe ...
- js进阶 11-19 jquery如何查找选择器的第一个父亲元素和第一个定位的父元素
js进阶 11-19 jquery如何查找选择器的第一个父亲元素和第一个定位的父元素 一.总结 一句话总结:closest()方法获得匹配选择器的第一个祖先元素,从当前元素开始沿 DOM 树向上.of ...
- [Ramda] Compose lenses
We can compose lenses to get value: const addrs = [{street: '99 Walnut Dr.', zip: '04821'}, {street: ...
- 阿里巴巴fastjson的使用
一.项目结构 一个学生类.当中学生类中能够包括Course类对象 使用Maven管理项目的能够加入fastjson的坐标: <dependency> <groupId>com. ...
- word-vba-microsoft(中英文)
中文 https://msdn.microsoft.com/zh-cn/vba/word-vba/articles/view-displaypageboundaries-property-word 英 ...
- 资源载入和页面事件 load, ready, DOMContentLoaded等
资源载入和页面事件 理想的页面载入方式 解析HTML结构. 载入并解析外部脚本. DOM树构建完成,运行脚本.//DOMInteractive –> DOMContentLoaded 载入图片. ...
- spring+aspectJ的实现
AspectJ:(Java社区里最完整最流行的AOP框架) spring自身也有一套AOP框架,但相比较于AspectJ,更推荐AspectJ 在Spring2.0以上版本中,可以使用基于Aspect ...
- AE属性表操作
转自chanyinhelv原文AE属性表操作 实现的操作包括:1.打开属性表:2.编辑属性表:3.增加属性列:4.数据排序:5.字段计算…… 嗯,实现的功能目前就这些吧,后续还会继续跟进,还望大家多多 ...