.NET压缩图片保存 .NET CORE WebApi Post跨域提交 C# Debug和release判断用法 tofixed方法 四舍五入 (function($){})(jQuery); 使用VUE+iView+.Net Core上传图片

时间:2021-11-26 19:14:50

.NET压缩图片保存

需求:

需要将用户后买的图片批量下载打包压缩,并且分不同的文件夹(因:购买了多个用户的图片情况)

文章中用到了一个第三方的类库,Nuget下载 SharpZipLib 目前用的 1.1的版本

效果:

.NET压缩图片保存  .NET CORE WebApi Post跨域提交  C# Debug和release判断用法  tofixed方法 四舍五入  (function($){})(jQuery);  使用VUE+iView+.Net Core上传图片

.NET压缩图片保存  .NET CORE WebApi Post跨域提交  C# Debug和release判断用法  tofixed方法 四舍五入  (function($){})(jQuery);  使用VUE+iView+.Net Core上传图片

服务器目录展示:

.NET压缩图片保存  .NET CORE WebApi Post跨域提交  C# Debug和release判断用法  tofixed方法 四舍五入  (function($){})(jQuery);  使用VUE+iView+.Net Core上传图片

里面对应目录层级的图片

前端提交POST请求案例:

function DownAllFile(filename, imgUrl, down) {

var urlStr = "";
//url字符串 (示例数据) (注意!: 使用 '逗号' 分隔文件名和 url 地址,使用 '$' 分隔 每个文件.)
if (filename != '' && imgUrl != '')
urlStr = filename + "," + imgUrl;

//form提交
var form = $('<form>');
form.attr('style', 'display:none');
form.attr('target', '');
form.attr('method', 'post');
form.attr('action', '/PayStripe.ashx?method=DownLoadImage'); //这里写对应的方法地址

var name1 = $('<input>');
name1.attr('type', 'text');
name1.attr('name', 'urlStr');
name1.attr('value', urlStr); //文件url

if (down == "P") {
var vals = "";
$.each($('input:checkbox:checked'), function () {
vals += $(this).val() + ",";
});
var checkbox1 = $('<input>');
checkbox1.attr('type', 'text');
checkbox1.attr('name', 'coid');
checkbox1.attr('value', vals); //文件url
form.append(checkbox1);
}
$('body').append(form);
form.append(name1);
form.submit();
form.remove();
}

后端实现代码:

//得到文件信息(名字,地址) (去掉最后一个 '$' , 并用 '$' 分隔字符串. 取到每个文件的文件名和路径 )
string[] urlArray = model.urlStr.TrimEnd('$').Split('$');

//存 文件名 和 数据流
Dictionary<string, Stream> dc = new Dictionary<string, Stream>();

//取出字符串中信息 (文件名和地址)
for (int i = 0; i < urlArray.Length; i++)
{
WebClient myWebClient = new WebClient();
//使用 ',' 分隔 文件名和路径 [0]位置是文件名, [1] 位置是路径
string[] urlSp = urlArray[i].Split(',');
//调用WebClient 的 DownLoadData 方法 下载文件
byte[] data = myWebClient.DownloadData(urlSp[1].Replace("_PB.jpg", "_B.jpg"));
Stream stream = new MemoryStream(data);//byte[] 转换成 流

//放入 文件名 和 stream
dc.Add(urlSp[0] + ".jpg" + "," + urlSp[2], stream);//这里指定为 .doc格式 (自己可以随时改)

if (urlArray.Length == 1)
{
Image img = Image.FromStream(stream);
MemoryStream ms = new MemoryStream();
img.Save(ms, ImageFormat.Jpeg);
img.Dispose();
context.Response.ClearContent();
context.Response.ContentType = "application/octet-stream";
context.Response.AppendHeader("Content-Disposition", "attachment;filename=" + urlSp[0] + ".jpeg");//文件名和格式(格式可以自己定)
context.Response.ContentType = "image/jpeg";
context.Response.BinaryWrite(ms.ToArray());
return;
}
}

//调用压缩方法 进行压缩 (接收byte[] 数据)
byte[] fileBytes = ConvertZipStream(dc);

context.Response.ContentType = "application/octet-stream";
context.Response.AppendHeader("Content-Disposition", "attachment;filename=SoonnetImage.rar");//文件名和格式(格式可以自己定)
context.Response.AddHeader("Content-Length", fileBytes.Length.ToString());//文件大小
context.Response.BinaryWrite(fileBytes); //放入byte[]
context.Response.End();
context.Response.Close();

/// <summary>
/// ZipStream 压缩
/// </summary>
/// <param name="streams">Dictionary(string, Stream) 文件名和Stream</param>
/// <returns></returns>
public static byte[] ConvertZipStream(Dictionary<string, Stream> streams)
{
byte[] buffer = new byte[6500];
MemoryStream returnStream = new MemoryStream();
var zipMs = new MemoryStream();
using (ICSharpCode.SharpZipLib.Zip.ZipOutputStream zipStream = new ICSharpCode.SharpZipLib.Zip.ZipOutputStream(zipMs))
{
zipStream.SetLevel(9);//设置 压缩等级 (9级 500KB 压缩成了96KB)
foreach (var kv in streams)
{
string[] fileName = kv.Key.Split(',');
using (var streamInput = kv.Value)
{
zipStream.PutNextEntry(new ICSharpCode.SharpZipLib.Zip.ZipEntry(fileName[1] + "/" + fileName[0]));  //主要是这里可以分文件夹自动压缩
while (true)
{
var readCount = streamInput.Read(buffer, 0, buffer.Length);
if (readCount > 0)
{
zipStream.Write(buffer, 0, readCount);
}
else
{
break;
}
}
zipStream.Flush();
}
}
zipStream.Finish();
zipMs.Position = 0;
zipMs.CopyTo(returnStream, 5600);
}
returnStream.Position = 0;

//Stream转Byte[]
byte[] returnBytes = new byte[returnStream.Length];
returnStream.Read(returnBytes, 0, returnBytes.Length);
returnStream.Seek(0, SeekOrigin.Begin);

return returnBytes;
}

注:

文章中代码有牵扯到 1 长图片点击直接下载的功能,可以删除部分逻辑实现,不同文件夹压缩图片功能。

该压缩并非会压缩图片本身,解压后,图片的大小跟实际大小一致。

.NET CORE WebApi Post跨域提交

参考博客:https://www.cnblogs.com/chongyao/p/8652743.html

搭建一个 .NET CORE 的 WebApi 想前后端分离, 于是为了简单做了个demo站点 弄个 index.html 页面 请求后台服务

<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

var par = fc.queryParams(1);

$.ajax({
method: 'Post',
url: 'http://127.0.0.1:52729/api/UI/GetReceivedDatas',
data: par,
dataType:"json",
contentType: 'application/x-www-form-urlencoded',
success: function (data) {
alert(data.errorMsg);
<!-- fc.tableInit(); -->
},
error: function (data) {
console.log("数据请求失败");
}
});

queryParams: function (params) {
var param = {
PreId: Number(params.offset / params.limit) + 1,
PlatformNo: $("#PlatformNo").val(),
StartTime: $("input[name='StartTime']").val(),
EndTime: $("input[name='EndTime']").val(),
MessageType: $("#MessageType").val()
};

后端配置.

public void Configure(IApplicationBuilder app)
{
app.UseCors("any");

}

public IServiceProvider ConfigureServices(IServiceCollection services)
{

  

//配置跨域处理
services.AddCors(options =>
{
options.AddPolicy("any", builder =>
{
builder.AllowAnyOrigin() //允许任何来源的主机访问
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();//指定处理cookie
});
});

}

[HttpPost]
public T GetReceivedDatas([FromForm]SearchDatasInputDto dto)
{

return default(T);

}

postman 提交出现415 媒体类型不支持错误

参考别人博客改成 [FromForm]  而不是 [FromBody]

没深入研究  'application/x-www-form-urlencoded', 和 'application/json'  的区别.

'application/json' 提交数据的话 参数对象是在 request payload 里面的  而且不是对象, 是字符串的显示方式

.NET压缩图片保存  .NET CORE WebApi Post跨域提交  C# Debug和release判断用法  tofixed方法 四舍五入  (function($){})(jQuery);  使用VUE+iView+.Net Core上传图片

C# Debug和release判断用法

C# Debug和release判断用法

#if (!DEBUG)
Response.Write("DEBUG下运行");
#else
Response.Write("release下运行");
#endif

}

tofixed方法 四舍五入

tofixed方法 四舍五入

toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。例如将数据Num保留2位小数,则表示为:toFixed(Num);但是其四舍五入的规则与数学中的规则不同,使用的是银行家舍入规则,银行家舍入:所谓银行家舍入法,其实质是一种四舍六入五取偶(又称四舍六入五留双)法。具体规则如下:

简单来说就是:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一。

javascript中(function($){...})(jQuery)写法是什么意思

这里实际上是匿名函数
function(arg){...}
这就定义了一个匿名函数,参数为arg

而调用函数 时,是在函数后面写上括号和实参的,由于操作符的优先级,函数本身也需要用括号,即:
(function(arg){...})(param)
这 就相当于定义了一个参数为arg的匿名函数,并且将param作为参数来调用这个匿名函数

而(function($){...}) (jQuery)则是一样的,之所以只在形参使用$,是为了不与其他库冲突,所以实参用jQuery

**************************************************************************
其实就等于
var fn = function($){....};
fn(jQuery);

其实可以这么理解,不过要注意的是fn是不存在的
那个函数直接定义,然后就运行了。就“压缩”成下面的样子了
(function($){...})(jQuery) 
**************************************************************************
简单理解是(function($){...})(jQuery)用来定义一些需要预先定义好的函数
$(function(){ })则是用来在DOM加载完成之后运行\执行那些预行定义好的函数.
****************************************

使用VUE+iView+.Net Core上传图片

我们直接进入主题,使用VS2017开发工具

首先要创建一个WebApi项目,创建完之后,在wwwroot文件下,创建一个文件夹 名字可以随意起  我这里呢就叫做Upload了

.NET压缩图片保存  .NET CORE WebApi Post跨域提交  C# Debug和release判断用法  tofixed方法 四舍五入  (function($){})(jQuery);  使用VUE+iView+.Net Core上传图片

ok ! 然后我们再创建一个控制器 IndexController 代码如下

要知道上传图片都是通过HTTP去请求,服务端从request中读取

.NET压缩图片保存  .NET CORE WebApi Post跨域提交  C# Debug和release判断用法  tofixed方法 四舍五入  (function($){})(jQuery);  使用VUE+iView+.Net Core上传图片
        public class PicData
        {
            public string Msg { get; set; }
        }

        [HttpPost]
        public async Task<bool> InsertPicture([FromServices]IHostingEnvironment environment)
        {
            var data = new PicData();
            string path = string.Empty;
            var files = Request.Form.Files;
            if (files == null || files.Count() <= 0)
            {
                data.Msg = "请选择上传的文件。";
                return false;
            }

            //格式限制
            var allowType = new string[] {"image/jpg", "image/png", "image/jpeg"};
            if (files.Any(c => allowType.Contains(c.ContentType)))
            {
                if (files.Sum(c => c.Length) <= 1024 * 1024 * 4)
                {
                    foreach (var file in files)
                    {
                        string strpath = Path.Combine("Upload", DateTime.Now.ToString("MMddHHmmss") + file.FileName);
                        path = Path.Combine(environment.WebRootPath, strpath);

                        using (var stream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite))
                        {
                            await file.CopyToAsync(stream);
                        }
                    }

                    data.Msg = "上传成功";
                    return true;
                }
                else
                {
                    data.Msg = "图片过大";
                    return false;
                }
            }
            else

            {
                data.Msg = "图片格式错误";
                return false;
            }
        }
.NET压缩图片保存  .NET CORE WebApi Post跨域提交  C# Debug和release判断用法  tofixed方法 四舍五入  (function($){})(jQuery);  使用VUE+iView+.Net Core上传图片
注意一下这段代码
string strpath = Path.Combine("Upload", DateTime.Now.ToString("MMddHHmmss") + file.FileName);

在wwwroot下创建的文件夹,要将Upload替换成你的文件夹名称

然后这还没有完,还要做跨域,要在Startup.cs文件中去改

.NET压缩图片保存  .NET CORE WebApi Post跨域提交  C# Debug和release判断用法  tofixed方法 四舍五入  (function($){})(jQuery);  使用VUE+iView+.Net Core上传图片
       public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            services.AddCors(options =>
            {
                options.AddPolicy("hehe", p => p.AllowAnyMethod()// 允许任何方法 GET,POST,PUT,DELETE, OPTIONS
                        .AllowAnyHeader()       // 允许任何请求头
                        .AllowAnyOrigin()       // 允许任何地址
                );
            });
        }
.NET压缩图片保存  .NET CORE WebApi Post跨域提交  C# Debug和release判断用法  tofixed方法 四舍五入  (function($){})(jQuery);  使用VUE+iView+.Net Core上传图片

ConfigureServices方法,然后还有Configure方法

.NET压缩图片保存  .NET CORE WebApi Post跨域提交  C# Debug和release判断用法  tofixed方法 四舍五入  (function($){})(jQuery);  使用VUE+iView+.Net Core上传图片
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseStaticFiles(); app.UseCors("hehe");
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseMvc();
        }
.NET压缩图片保存  .NET CORE WebApi Post跨域提交  C# Debug和release判断用法  tofixed方法 四舍五入  (function($){})(jQuery);  使用VUE+iView+.Net Core上传图片

ok完成了,

然后我们就要去创建Vue项目了,

使用npm创建vue项目,vue init webpack file     我们跳过创建过程

使用npm 引用iview  然后在vue项目中的main.js中引用

import iView from 'iview';
import 'iview/dist/styles/iview.css';
import locale from 'iview/dist/locale/en-US';

Vue.use(iView, { locale });

ok,然后我们就在app.vue里面写代码

.NET压缩图片保存  .NET CORE WebApi Post跨域提交  C# Debug和release判断用法  tofixed方法 四舍五入  (function($){})(jQuery);  使用VUE+iView+.Net Core上传图片
<template>
  <div id="app">

    <Upload action="http://localhost:53688/api/Index">
        <Button icon="ios-cloud-upload-outline">Upload files</Button>
    </Upload>

  </div>
</template>
.NET压缩图片保存  .NET CORE WebApi Post跨域提交  C# Debug和release判断用法  tofixed方法 四舍五入  (function($){})(jQuery);  使用VUE+iView+.Net Core上传图片

action:就是api的地址