总结一下.net core的上传文件操作,这里主要分上传到本地的也就是MVC的,另一种是上传到WebAPi的.

一、Web端

1.新建一个.net core mvc项目

2.这里的版本是.net core 2.2.4

3.新建一个控制器 TestController

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc; namespace Web.Controllers
{
public class TestController : Controller
{
private readonly IHostingEnvironment _hostingEnvironment;
public TestController(IHostingEnvironment hostingEnvironment)
{
_hostingEnvironment = hostingEnvironment;
}
public IActionResult Index()
{
return View();
} /// <summary>
/// 上传图片
/// </summary>
/// <returns></returns>
[HttpPost]
public string UploadFiles(string z)
{
long size = ;
var path = "";
var files = Request.Form.Files;
foreach (var file in files)
{
var filename = ContentDispositionHeaderValue
.Parse(file.ContentDisposition)
.FileName
.Trim('"');
string fileExt = Path.GetExtension(file.FileName); //文件扩展名
long fileSize = file.Length; //获得文件大小,以字节为单位
string newFileName = System.Guid.NewGuid().ToString() + fileExt; //随机生成新的文件名
path = "/upload/" + newFileName;
path = _hostingEnvironment.WebRootPath + $@"\{path}";
size += file.Length;
using (FileStream fs = System.IO.File.Create(path))
{
file.CopyTo(fs);
fs.Flush();
}
path = "/upload/" + newFileName;
}
return path;
} }
}

4.新建页面Index

@{
Layout = null;
} <!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
</head>
<body>
<form id="form0">
<input type="file" name="file" />
<input type="button" value="上传本地" onclick="upload()" />
</form>
</body>
</html>
<script src="~/lib/jquery/dist/jquery.js"></script>
<script src="~/js/jquery.form.js"></script>
<script>
function upload() {
var formData = new FormData($("#form0")[]);
$.ajax({
url: "/test/UploadFiles",
data: formData,
contentType: false,
processData: false,
cache: false,
type: 'post',
success: function (d) {
console.log(d);
}
})
} </script>

5.注意:默认所有的静态文件都放在wwwroot 所以这里我在wwwroot下创建了文件夹upload从来存储文件

这样Web端的上传文件就搞定了

二、WebApi端

1.新建一个webapi项目

2.新建一个api控制器 TestApiController

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json; namespace WebApi.Controllers
{
[EnableCors("AllowSameDomain")]//跨域
[Route("api/[controller]/[action]")]
[ApiController]
public class TestApiController : ControllerBase
{
private readonly IHostingEnvironment _hostingEnvironment; public TestApiController(IHostingEnvironment hostingEnvironment)
{
_hostingEnvironment = hostingEnvironment;
} [HttpPost]
public ResultObject UploadIForm(List<IFormFile> files)
{
List<String> filenames = new List<string>(); foreach (var file in files)
{
var fileName = file.FileName;
Console.WriteLine(fileName); fileName = $"/UploadFile/{fileName}";
filenames.Add(fileName); fileName = _hostingEnvironment.WebRootPath + fileName; using (FileStream fs = System.IO.File.Create(fileName))
{
file.CopyTo(fs);
fs.Flush();
}
} return new ResultObject
{
state = "Success",
resultObject = filenames
};
}
[HttpPost]
public string Upload(IFormCollection Files)
{ try
{
//var form = Request.Form;//直接从表单里面获取文件名不需要参数
string dd = Files["File"];
var form = Files;//定义接收类型的参数
Hashtable hash = new Hashtable();
IFormFileCollection cols = Request.Form.Files;
if (cols == null || cols.Count == )
{
return JsonConvert.SerializeObject(new { status = -, message = "没有上传文件", data = hash });
}
foreach (IFormFile file in cols)
{
//定义图片数组后缀格式
string[] LimitPictureType = { ".JPG", ".JPEG", ".GIF", ".PNG", ".BMP" };
//获取图片后缀是否存在数组中
string currentPictureExtension = Path.GetExtension(file.FileName).ToUpper();
if (LimitPictureType.Contains(currentPictureExtension))
{ //为了查看图片就不在重新生成文件名称了
// var new_path = DateTime.Now.ToString("yyyyMMdd")+ file.FileName;
var new_path = Path.Combine("uploads/images/", file.FileName);
var path = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", new_path); using (var stream = new FileStream(path, FileMode.Create))
{ //图片路径保存到数据库里面去
bool flage = true;
if (flage == true)
{
//再把文件保存的文件夹中
file.CopyTo(stream);
hash.Add("file", "/" + new_path);
}
}
}
else
{
return JsonConvert.SerializeObject(new { status = -, message = "请上传指定格式的图片", data = hash });
}
} return JsonConvert.SerializeObject(new { status = , message = "上传成功", data = hash });
}
catch (Exception ex)
{ return JsonConvert.SerializeObject(new { status = -, message = "上传失败", data = ex.Message });
} } }
public class ResultObject
{
public String state { get; set; }
public Object resultObject { get; set; }
} }

3.这里前台页面还是通过ajax来请求api的,所以就需要进行跨域

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; namespace WebApi
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
} public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
//允许一个或多个具体来源:
services.AddCors(options =>
{
// Policy 名稱 CorsPolicy 是自訂的,可以自己改
//跨域规则的名称
options.AddPolicy("AllowSameDomain", policy =>
{
// 設定允許跨域的來源,有多個的話可以用 `,` 隔開
policy
.WithOrigins("http://127.0.0.1:53189", "http://localhost:53189")
//.AllowAnyOrigin()//允许所有来源的主机访问
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();//指定处理cookie
});
}); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
} // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseCors("AllowSameDomain");//必须位于UserMvc之前
app.UseMvc();
}
}
}

4.前台页面 还是用这个方法,url改下

function upload1() {
var formData = new FormData($("#form0")[]);
$.ajax({
url: "http://127.0.0.1:8067/api/testapi/Upload",
data: formData,
contentType: false,
processData: false,
cache: false,
type: 'post',
success: function (d) {
console.log(d); }
})
}

5.将webapi发布到iis

6.同样的,静态文件还是在wwwroot下,api发布后是没有wwwroot文件夹的,所以直接建 /wwwroot/upload文件夹

这样上传就搞定了

.net core2.2上传文件总结的更多相关文章

  1. IE8/9 JQuery.Ajax 上传文件无效

    IE8/9 JQuery.Ajax 上传文件有两个限制: 使用 JQuery.Ajax 无法上传文件(因为无法使用 FormData,FormData 是 HTML5 的一个特性,IE8/9 不支持) ...

  2. 三种上传文件不刷新页面的方法讨论:iframe/FormData/FileReader

    发请求有两种方式,一种是用ajax,另一种是用form提交,默认的form提交如果不做处理的话,会使页面重定向.以一个简单的demo做说明: html如下所示,请求的路径action为"up ...

  3. asp.net mvc 上传文件

    转至:http://www.cnblogs.com/fonour/p/ajaxFileUpload.html 0.下载 http://files.cnblogs.com/files/fonour/aj ...

  4. app端上传文件至服务器后台,web端上传文件存储到服务器

    1.android前端发送服务器请求 在spring-mvc.xml 将过滤屏蔽(如果不屏蔽 ,文件流为空) <!-- <bean id="multipartResolver&q ...

  5. .net FTP上传文件

    FTP上传文件代码实现: private void UploadFileByWebClient() { WebClient webClient = new WebClient(); webClient ...

  6. 通过cmd完成FTP上传文件操作

    一直使用 FileZilla 这个工具进行相关的 FTP 操作,而在某一次版本升级之后,发现不太好用了,连接老是掉,再后来完全连接不上去. 改用了一段时间的 Web 版的 FTP 工具,后来那个页面也 ...

  7. 前端之web上传文件的方式

    前端之web上传文件的方式 本节内容 web上传文件方式介绍 form上传文件 原生js实现ajax上传文件 jquery实现ajax上传文件 form+iframe构造请求上传文件 1. web上传 ...

  8. Django session cookie 上传文件、详解

    session 在这里先说session 配置URL from django.conf.urls import patterns, include, url from django.contrib i ...

  9. 4 django系列之HTML通过form标签来同时提交表单内容与上传文件

    preface 我们知道提交表单有2种方式,一种直接通过submit页面刷新方法来提交,另一种通过ajax异步局部刷新的方法提交,上回我们说了通过ajax来提交文件到后台,现在说说通过submit来提 ...

随机推荐

  1. Python--day46--用户管理设计方案介绍

    1,基于用户权限管理: 2,基于角色的权限管理: 开始一个项目如果要100天的,可能70天都在设计,比如设计数据库表结构,最后30天才是写代码.设计是最难的,写代码是最简单的. 还有一个重要的一点,写 ...

  2. [android] eclipse里面的安卓模拟器起不来

    提示信息可能是: The connection to adb is down, and a severe error has occured. 网上看了下,常见原因有两个: 1,系统里面另外有个叫ad ...

  3. P1071 01字符串的交叉安排

    题目描述 你有 \(n(1 \le n \le 10^6)\) 个字符'0' 和 \(m(1 \le m \le 10^6)\) 个字符'1'.你需要使用这些字符拼接成一个01字符串,使得满足如下两个 ...

  4. P1058 车厢重组

    题目描述 在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转.一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转 \(180\) 度,则可以把相邻两节车厢的位置交换,用这种方法可 ...

  5. activeMQ的两个默认端口8161和61616的区别

    activeMQ默认配置下启动会启动8161和61616两个端口,其中8161是mq自带的管理后台的端口,61616是mq服务默认端口 . 8161是后台管理系统,61616是给java用的tcp端口 ...

  6. eslint在webstorm中有错误警告

    1. 报错Missing space before function parentheses的问题 解决:在代码目录中,打开.eslint文件,并在rules中添加如下一行代码即可: "sp ...

  7. WindowsDOS命令添加/创建/修改/删除服务

    添加服务 sc <server> create [service name] [binPath= ] <option1> <option2>... 在注册表和服务数 ...

  8. APK签名替换检测

    APK二次打包的危害 APK二次打包是Android应用安全风险中的一部分, 一般是通过反编译工具向应用中插入广告代码与相关配置,再在第三方应用市场.论坛发布.打包党对移动App带来的危害有以下几种: ...

  9. python基础试题(一)

    1.执行 Python 脚本的两种方式 1.python 进入解释器 2.python 1.py 执行文件 limux里 ./1.py 2.简述位.字节的关系 8位1个字节.计算机处理以字节为单位,存 ...

  10. Java泛型类特性

    在2004年末Java推出了Java5,其中提供了对泛型方法和类的支持,也围绕着泛型推出了一下特性,本章将对Java泛型进行综合的概括 1.泛型特性构件pre-Java 5 1.使用Object表示泛 ...