精华内容
下载资源
问答
  • 贴图小王子图床服务器端代码 使用Node.js搭建,完成了以下任务: 接收从贴图小王子App上传的图片,生成缩略图,并将原图和缩略图分别存到不同的文件夹中。 支持查询接收到的原图及其缩略图的信息。 支持浏览器直接...
  • win10 uwp 使用 asp dotnet core 做图床服务器客户端 原文 win10 uwp 使用 asp dotnet core 做图床服务器客户端 本文告诉大家如何在 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或博客园,但是一旦发布了就不再更新

    posted on 2018-11-08 15:36 NET未来之路 阅读(...) 评论(...) 编辑 收藏

    转载于:https://www.cnblogs.com/lonelyxmas/p/9929389.html

    展开全文
  • Python3 初学实践案例(14)打造一个私人图床服务器 近来工作压力颇大,一直都在从事项目的开发工作,所以自学 python 的进度也拉下来一截,哎。由于进来很多项目用 react 编写,所以准备些一些相关的博客文章。...

    Python3 初学实践案例(14)打造一个私人图床服务器

    近来工作压力颇大,一直都在从事项目的开发工作,所以自学 python 的进度也拉下来一截,哎。由于进来很多项目用 react 编写,所以准备些一些相关的博客文章。但是博客的图片管理颇让人烦恼。之前尝试过把新浪微博当成图床,但是上传的稳定性一直是一个问题。使用 csdn 的博客图片上传功能吧,一直也比较不方便。因此,昨天突发奇想,决定写一个私人的图床服务器,放在我自己的服务器上。

    需求分析

    要干什么,首先要明确,到底要TM干什么。列出需求如下:

    1. 这是一个图片上传服务,需要随时接收我的图片文件。
    2. 只能接收我上传文件,因此需要认证机制。
    3. 只能在我允许的站点显示图片,其他站点都应该是无权访问,所谓防盗链机制。
    4. 图片不允许重复上传,毕竟硬盘不大。
    5. 因为只是自己使用,所以文件校验和图片大小校验等,可以放松。

    综上,是我的需求。将他们详细分析一下,得到:

    1. 我需要一个 http 的接口服务,为 Post 接口,用来接受我的图片上传请求。
    2. 图片不校验大小,采用 nginx 的默认配置,图片文件格式校验采用后缀名。
    3. 该接口必须使用密钥验证,没有密钥的人无法访问。嗯,随机一个加密字符串就可以。
    4. 图片命名采用 md5 的方式,我不能保证自己不上传重复文件,但要保证服务器不会重复浪费磁盘空间。
    5. 因为要防盗链,虽然可以使用 nginx 来进行配置,但是,还是在 python 中实现比较好。
    6. 所以需要一个 get 接口,通过接口判断是否具有权限,返回不同图片。

    开发图床

    技术选型

    首先,是使用 python3.6 为开发语言,这个是确定了的。但是如何开发这个,我花了5分钟考虑了一下。第一种呢,是全部自己实现。也不是不可以,但是我感觉耗费的时间有点不值当子。第二种呢,是使用公司目前采用的自研开发框架,这个是最顺手的,但问题是,我就是干这么个小活儿,不至于杀鸡用牛刀。嗯,那就采用第三方的框架,并迅速的锁定了 sanic 框架。

    sanic 是一个比较新的,但是发展比较快的框架。其特征是速度非常快。据他们官方网站自己说,sanic 是最快的 python 框架。

    sanic 官方文档地址:http://sanic.readthedocs.io/en/latest/

    开干。

    最终代码

    #!/usr/bin/env python3
    # -*- coding: UTF-8 -*-
    from sanic import Sanic
    from sanic.response import json, text, file
    import os, sys
    import hashlib
    import base64
    
    app = Sanic()
    # 图片存储目录
    baseDir = sys.path[0] + '/image/'
    # 校验 Token 写死就成,反正自己用的嘛
    token = 'SheIsABeautifulGirl'
    # 允许的域名列表
    allowHost = [
                'localhost',
                'ilovethisword',
                'i.fengcss.com',
                'blog.csdn.net'
            ]
    
    # 成功返回方法
    def ok(data):
        if type(data) == list:
            return json({"data": {"list": data}, "status": 0})
        else:
            return json({"data": data, "status": 0})
    # 失败返回方法
    def fail(data):
        return json({"data": data, "status": 1})
    
    # 获取图片后缀名
    def getSuffix(filename):
        tempArr = filename.split('.')
        suffix = tempArr[-1]
        fileType = ['jpg', 'jpeg', 'gif', 'png']
        if len(tempArr) < 2:
            return 'error name'
        elif suffix not in fileType:
            return 'error type'
        else:
            return suffix
    # 检查请求地址是否授权
    def checkHost(host):
        for i in allowHost:
            if i in host:
                return True
        return False
    
    # 上传图片文件接口
    @app.route('/api/v1/upimg', methods=['POST'])
    async def upimg(request):
        # 判断用户是否具有上传权限
        if request.headers.get('token') != token:
            return fail('您没有使用本服务的权限')
        image = request.files.get('file').body
        # 判断文件是否支持
        imageName = request.files.get('file').name
        imageSuffix = getSuffix(imageName)
        if 'error' in imageSuffix:
            return fail(imageSuffix)
        # 组织图片存储路径
        m1 = hashlib.md5()
        m1.update(image)
        md5Name = m1.hexdigest()
    
        # 用 md5 的前两位来建文件夹,防止单个文件夹下图片过多,又或者根目录下建立太多的文件夹
        saveDir = baseDir + md5Name[0:2] + '/'
        savePath = saveDir + md5Name[2:] + '.' + imageSuffix
        resPath = '/' + md5Name[0:2] + '/' + md5Name[2:] + '.' + imageSuffix
    
        # 如果文件夹不存在,就创建文件夹
        if not os.path.exists(saveDir):
            os.makedirs(saveDir)
    
        # 将文件写入到硬盘
        tempFile = open(savePath, 'wb')
        tempFile.write(image)
        tempFile.close()
    
        # 给客户端返回结果
        return ok({"path": resPath})
    
    # 请求图片接口
    @app.route('/', methods=['GET'])
    async def img(request):
        # 判断是否为网站请求,否则就加上自定义的字符串(允许本地访问)
        host = request.headers.get('referer') or 'ilovethisword'
        # 判断请求接口是否带参数,否则加上自定义字符串(没有这个文件夹,返回404)
        args = request.args.get('path') or 'ilovemywife'
        # 拼接文件地址
        path = baseDir + args
        # 如果不在允许列表,则展示 401 图片
        if not checkHost(host):
            path = baseDir + '/7b/e49a54f761da42174d6121fa13e0b3.png'
        # 如果文件不存在,则展示 404 图片
        if not os.path.exists(path):
            path = baseDir + '/b4/74335c3944f42275e3caa13930a9b9.png'
        # 返回文件
        return await file(path)
    # 启动服务
    if __name__ == "__main__":
        app.run(host="127.0.0.1", port=8000)

    部署图床

    程序开发完成后,通过本地测试,确定没啥问题,决定上生产环境。(就是放到我的小破驴上去)

    centos 7 系统 yum 源中 python 最高版本为 3.4 ,嗯,安装一下。不详述了,详情请查看How to Install Python 3.6.4 on CentOS 7

    搞好环境之后,先找个地方把文件村上。这里我的存储位置是 /srv/py-tuchuang/run.py

    配置 python 服务

    首先,我们使用 chmod +x /srv/py-tuchuang/run.py 命令,让程序具有执行权限。

    然后,我们用 vim /usr/lib/systemd/system/py-tuchuang.service 命令创建一个程序文件,然后输入以下内容

    [Unit]
    Description=Python image upload and download Service
    After=network.target
    Wants=network.target
    
    [Service]
    Type=simple
    # 用户要配置有文件读写权限的,实在不行就root
    User=root
    Group=root
    # 重要的就是下面的这句话
    ExecStart=/srv/py-tuchuang/run.py
    
    [Install]
    WantedBy=multi-user.target

    保存退出之后,我们使用下面的命令,分别设置立即启动和开机启动

    # 启动服务
    systemctl start py-tuchuang.service
    # 将服务设置为开机启动
    systemctl enable py-tuchuang.service

    好,以上,我们的服务就已经配置好了。但是,我们程序中设定我们的服务是跑在 127.0.0.1 这个 ip 上的。所以,他只能跑在本地,你不能访问到,所以,我们需要一层代理。

    配置 nginx 代理

    nginx 是我服务器上现成的,毕竟服务器不是为了专门干这么一件破事儿嘛。

    vim /etc/nginx/nginx.conf 编辑配置文件,在合适位置添加如下内容

    server {
      server_name __YOU_DOMAIN_IN_HERE__;
      location / {
        proxy_pass  http://127.0.0.1:8000;
      }
    }

    然后保存退出,重启 nginx 服务。然后就可以啦。

    使用图床

    图床已经搭建好了,我们如何使用呢?方法有很多哦!

    命令行上传图片

    其实非常简单,我们在命令行中输入以下命令就可以上传文件了。

    curl http://__YOU_DOMAIN_IN_HERE__/api/v1/upimg -F "file=@__UPFILE__PATH__" -H "token: SheIsABeautifulGirl" -v

    将上面的 __YOU_DOMAIN_IN_HERE__ 替换为你的服务域名, __UPFILE__PATH__ 修改为你要上传的文件路径,然后,就可以上传文件啦~

    再写一个脚本,完全可以啦。不过还是破烦。

    自己写一个前端页面,专门用来上传

    …省略

    jquery 或者 vue 或者其他什么,写一个上传文件的前端脚本还是不难的,不过不在本文讨论范围之内。

    配置 MWeb 编辑器图床

    如下图配置 MWeb 编辑器,然后在里面写文章的时候,就太TM方便啦。随便一个屏幕截图,也不需要保存,直接到编辑器中粘贴,就会自动上传,并获取地址,变成 markdown 代码存好。

    20180614104107

    本地图片也是非常方便,直接往编辑器中一拖动,就可以了。

    好,这就是本人自己搞一个私人图床服务器的全部过程,希望对大家有所帮助。

    本文由 FungLeo 原创,允许转载,但转载必须保留首发链接。

    展开全文
  • title author date CreateTime categories win10 uwp 使用 asp dotnet core 做图床服务器客户端 lindexi 2018-10-31 14:12:29 +0800 2018-10-18 20:11:48 +0800 Win10 UWP...
        
    title author date CreateTime categories
    win10 uwp 使用 asp dotnet core 做图床服务器客户端
    lindexi
    2018-10-31 14:12:29 +0800
    2018-10-18 20:11:48 +0800
    Win10 UWP dotnet

    本文告诉大家如何在 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)

    这里有一个细节是参数 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 qarJorfis = await rejairJate.GetStreamAsync(sairlallilarRaibedoYertousebow);

    保存到应用程序的临时文件夹

                    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

    展开全文
  • 其实也可以买一个图床解决,奈何囊中羞涩,并且还是不想将图片保存到别人的服务器。于是,想通过 markdown文档插入base64图片的方法,完成方便地进行博文上传。 目标功能、问题及解决方案 因此,想要实现功能: 将...

    一、项目简介

    问题来源

    每次本地写好markdown格式的文档后,想要将它上传到博客网站上,但是本地的图片无法直接复制到网站的博客页面,每个图片需要重新点击上传,然后上传本地文件。其实也可以买一个图床解决,奈何囊中羞涩,并且还是不想将图片保存到别人的服务器。于是,想通过 markdown文档插入base64图片的方法,完成方便地进行博文上传。

    目标功能、问题及解决方案

    因此,想要实现功能:

    • 将已有的markdown文本转化为插入了base64图片编码的markdown

    要实现上述功能,存在几个问题:

    • base64编码太长了,不利于博文的观看
    • base64编码太长了,导致文本内容极大

    以下面两种方法来解决:

    • 针对base64编码太长了,不利于博文观看的问题。

    • base64编码太长了,导致文本内容极大

      • 解决方法: 对图像大小进行压缩, 其相应的base64编码也会压缩(当然,也会牺牲图片的清晰度)

    综上所述,我要实现的是:

    通过一个python程序将 本地的markdown文件及文件关联的本地图片, 生成一个新的只有 base64 编码的markdown文件(观看效果与原文件相同,且完全不依赖原文件).

    二、源程序思路简介

    思路:

    通过正则表达式搜索源文件中的图片格式,然后替换成base64的格式,base64编码在文件最后追加,并保存为新文件。

    代码片段

    引入依赖包

    from PIL import Image
    import os
    import base64
    import re
    

    函数: 图片转base64

    #将地址为address的图片转为base64字符串
    def phtot_base64(address):
        with open(address,"rb") as photo:
            pb=base64.b64encode(photo.read())
            return str(pb)[2:-1]
    

    函数:获得文件的大小(单位kb)

    # 获取文件大小:KB
    def get_size(file):
        size = os.path.getsize(file)
        return size / 1024
    

    函数:压缩图像

    def compress_image(infile_path, outfile_path, aim_size, step=10, quality=80):
        """不改变图片尺寸压缩到指定大小
        :param infile: 压缩源文件
        :param outfile: 压缩文件保存地址
        :param aim_size: 压缩目标,KB
        :param step: 每次调整的压缩比率
        :param quality: 初始压缩比率
        :return: 压缩文件地址,压缩文件大小
        """
        o_size = get_size(infile_path)
        # 如果当前图片大小小于压缩目标大小
        if o_size <= aim_size:
            im = Image.open(infile_path)
            im = im.convert('RGB')  # 为了存成jpg文件,将图像转成rgb
            im.save(outfile_path, quality=quality)  # 保存压缩后的图像
            print("图片已被压缩!")
            return infile_path
        
    	# 如果当前图片大小大于压缩目标大小
        while o_size > aim_size:
            im = Image.open(infile_path)
            im = im.convert('RGB')  # 为了存成jpg文件,将图像转成rgb
            im.save(outfile_path, quality=quality)  # 保存压缩后的图像
            if quality - step < 0:
                break
            quality -= step
            o_size = get_size(outfile_path)
    
        print("图片已被压缩!")
        return outfile_path
    

    具体的实现流程可以下次再说,代码已开源,欢迎访问并star我的gitee项目markdown image to base64.

    三、效果展示及使用说明

    文件目录如下:

    image-20210422213420443

    我们现在对【test.md】进行格式转化。pic文件夹中有图片如下,且已经被【test.md】引用:

    image-20210422213554616

    执行【img_to_base64.py】!!!,需要输入原始markdown路径,及希望压缩图片到多大。运行及打印结果如下:

    (base) PS E:\mydoc\done\2021\summer\md_img2base64_project\tests> python .\img_to_base64.py
    
    ******************************
    请输入目标markdown文件地址:
    "E:\mydoc\done\2021\summer\md_img2base64_project\tests\test.md"
    ******************************
    
    ******************************
    请输入压缩图片允许最大体积(单位:KB): 100
    ******************************
    
    ******************************
    图片:【pic/image-20210422132634431.png】被读取!
    
    原始图像base64文本长度为:28816
    图片已被压缩!
    压缩图像base64文本长度为:28816
    ******************************
    
    ******************************
    图片:【pic/image-20210422132812199.png】被读取!
    
    原始图像base64文本长度为:233024
    图片已被压缩!
    压缩图像base64文本长度为:21488
    ******************************
    
    
    ******************************
    文件图片转换成功!
    ******************************
    请按任意键继续. . .
    

    之后文件目录编程这样:

    image-20210422214111891

    【对比两个markdown文本】:

    原文件:

    ![image-20210422132634431](pic/image-20210422132634431.png)
    
    阿斯顿发撒打发
    
    
    
    ### 方法士大夫
    
    /撒大大
    
    
    
    $\sigma$
    
    ![image-20210422132812199](pic/image-20210422132812199.png)
    

    转换后文件:

    ![image-20210422132634431][Fig1]
    
    阿斯顿发撒打发
    
    
    
    ### 方法士大夫
    
    /撒大大
    
    
    
    $\sigma$
    
    ![image-20210422132812199][Fig2]
    
    ****************************************************************************************************
      
    ****************************************************************************************************
      
    ****************************************************************************************************
    
    [Fig1]:data:image/png;base64,iVBORw0KGgoAAAANSUhE...(省略)
    
    [Fig2]:data:image/png;base64,iVBORw0KGgoAAAANSUhE...(省略)
    

    完美解决,从此告别图床服务器!

    我还将该程序打包为可执行的exe文件,只要将文件放到markdown文件所在目录即可。

    欢迎访问并star我的gitee项目markdown image to base64.




    展开全文
  • 于是,痛定思痛自己买个云主机、自己搭图床应用! 1、七牛图片批量下载到本地 1.1 曲折尝试 当测试链接不能用的时候,我想依次用到下面几个方法尝试download图片: 用七牛之前的传图工具qshell,看看有啥办法(行...
  • 前几天学习了白嫖git以及七牛云作为图床,然后发现他们的使用方式无非就是把img标签里填本地素材路径的地址修改成了url链接,而这个链接自然就是指向他们平台下的某服务器下的某个文件夹下的某文件,那这样一来的话...
  • 图床

    2020-12-24 21:06:44
    title: 免费图床 ...图床:一般指的是存储图片的服务器。 发现一个可在线上传,且免费的图床网站,一键生成Markdow,HTML等文件的外链接,方便简洁,超级好用!!! 效果图如下: 点击[链接],到达图床网站。 ...
  • SM.MS 免费图床也慢慢走上收费的道路,于是我就萌生了自建图床的想法。由于本人比较菜,没有计算机基础,更不是相关专业的,所以与其说是教程,不如说是实况记录?欢迎大佬们指点。 今天的主角是:Chevereto 【开源...
  • 免费图床网站推荐

    千次阅读 2020-09-11 18:05:06
    长期保存需要注册使用,这个图床服务器在国内应该还用了cdn,总之速度非常快 路过图床 官网地址:https://imgchr.com 简介:支持免注册上传图片,永久存储,支持HTTPS加密访问和调用图片,提供多种图片链接格式,成...
  • Typora阿里云图床

    2020-07-07 23:59:09
    这篇博客记录一下使用阿里云作为Typora图床服务器的主要设置。 Typora 个人感觉Typora是Windows平台上比较好用的一款markdown编辑软件了,但是直到最新版本0.9.89才支持图床。简单来说图床就是把markdown里面添加的...
  • 服务器上搭建 Chevereto 图床

    千次阅读 2018-11-18 20:37:20
    最近在搭建博客、在写文章的时候因为服务器资源和网络环境的问题需要所以选择使用国内图床、来加速网站的访问速度。 刚开始是使用路过图床、但是后来发现我托管在路过图床上的图片国内不能访问了、然后开始将博客...
  • OSS搭建halo博客图床

    2020-03-12 18:33:57
    一、基本概念 在为博客搭建图床之前,先了解一些...在halo的后台博客设置-附件设置中有设置图床服务器的地址,存储位置可以是本地、又拍云、七牛云、阿里云、腾讯云、百度云等,如果你的ECS空间比较大,或者纯粹不想...
  • 自己的云服务器闲着也是闲着,搞个个人图床试试 1.想看看有没有什么好的开源项目可以直接用就是这么懒 2.强烈推荐Lychee: 荔枝图床 3.竟然还有docker镜像 4.docker 安装 就是爽。。 5.有自己的图床了,传两个图片...
  • 什么是图床?...而免费的公共图床服务器,无论在安全性还是可靠性都是没有保障的,数据容易丢失。 最开始使用腾讯云的对象存储,因后期可能有收费的风险,所以把目标指向了github、gitee等免费大空间存储库。 g
  • 项目目录1.前言1.1 项目背景1.2 ...系统设计3.1 数据库设计3.2 服务器API设计(前后端交互接口设计)3.2.1 新增图片(上传图片)3.2.2 查看所有图片信息(数据库里面存的属性信息)3.2.3 查看指定图片属性3.2.4 删除

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 478
精华内容 191
关键字:

图床服务器