C# Web Api 上传文件
一、 使用默认方法上传文件:
1、Action:
/// <summary>
/// 上传文件 使用上传后的默认文件名称
/// 默认名称是BodyPart_XXXXXX,BodyPart_加Guid码
/// </summary>
/// <returns></returns>
[HttpPost, Route("Upload")]
public async Task<string> Upload()
{
try
{
//web api 获取项目根目录下指定的文件下
var root = System.Web.Hosting.HostingEnvironment.MapPath("/Resource/Images");
var provider = new MultipartFormDataStreamProvider(root); //文件已经上传 但是文件没有后缀名 需要给文件添加后缀名
await Request.Content.ReadAsMultipartAsync(provider); foreach (var file in provider.FileData)
{
//这里获取含有双引号'" '
string filename = file.Headers.ContentDisposition.FileName.Trim('"');
//获取对应文件后缀名
string fileExt = filename.Substring(filename.LastIndexOf('.')); FileInfo fileinfo = new FileInfo(file.LocalFileName);
//fileinfo.Name 上传后的文件路径 此处不含后缀名
//修改文件名 添加后缀名
string newFilename = fileinfo.Name + fileExt;
//最后保存文件路径
string saveUrl = Path.Combine(root, newFilename);
fileinfo.MoveTo(saveUrl);
}
return "success";
}
catch (Exception ex)
{
throw ex;
}
}
2、html模拟代码:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<h1>柠檬伙伴云</h1>
<form action="/Test/Upload" method="post" enctype="multipart/form-data"> <input type="file" name="f1" /> <br /><br />
<input type="file" name="f2" /> <br /><br /> <input type="submit" value="上传图片" /> </form>
</body>
</html>
3、效果如下图:

上图就是上传后文件没有后缀名效果

对第一张没有后缀名添加后缀名的效果
二、修改上传文件后缀名
1、action:
/// <summary>
/// 上传文件 修改上传文件名称 也不包含后缀名
/// </summary>
/// <returns></returns>
[HttpPost, Route("Upload2")]
public async Task<string> Upload2()
{
try
{
//web api 获取项目根目录下指定的文件下
var root = System.Web.Hosting.HostingEnvironment.MapPath("/Resource/Images");
//对上传文件重新命名 根据需求对应修改文件名称 不包含后缀名 只是前缀名
var provider = new RenamingMultipartFormDataStreamProvider(root); //文件已经上传 但是文件没有后缀名 需要给文件添加后缀名
await Request.Content.ReadAsMultipartAsync(provider); foreach (var file in provider.FileData)
{
//这里获取含有双引号'" '
string filename = file.Headers.ContentDisposition.FileName.Trim('"');
//获取对应文件后缀名
string fileExt = filename.Substring(filename.LastIndexOf('.')); FileInfo fileinfo = new FileInfo(file.LocalFileName);
//fileinfo.Name 上传后的文件路径 此处不含后缀名
//修改文件名 添加后缀名
string newFilename = fileinfo.Name + fileExt;
//最后保存文件路径
string saveUrl = Path.Combine(root, newFilename);
fileinfo.MoveTo(saveUrl);
}
return "success";
}
catch (Exception ex)
{
throw ex;
}
}
2、RenamingMultipartFormDataStreamProvider 类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;
using System.Net.Http.Headers;
using System.IO; namespace Test.One.Common
{
public class RenamingMultipartFormDataStreamProvider : MultipartFormDataStreamProvider
{
/// <summary>
/// 文件重命名
/// </summary>
/// <param name="root"></param>
public RenamingMultipartFormDataStreamProvider(string root)
: base(root)
{
}
/// <summary>
/// 文件重命名
/// </summary>
/// <param name="headers"></param>
/// <returns></returns>
public override string GetLocalFileName(HttpContentHeaders headers)
{
string fileName = headers.ContentDisposition.Name;
if (!string.IsNullOrWhiteSpace(fileName))
{
fileName = Guid.NewGuid().ToString();
}
return fileName.Replace("\"", string.Empty);
}
}
}
3、html 模拟代码:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<h1>柠檬伙伴云</h1>
<form action="/Test/Upload2" method="post" enctype="multipart/form-data"> <input type="file" name="f1" /> <br /><br />
<input type="file" name="f2" /> <br /><br /> <input type="submit" value="上传图片" /> </form>
</body>
</html>
3、效果:

实例二:
api:
/// <summary>
/// TestFile
/// </summary>
/// <returns></returns>
[HttpPost,Route("TestFile")]
public async Task<Result<bool>> TestFile()
{
Result<bool> result = new Result<bool>();
try
{
if (!Request.Content.IsMimeMultipartContent())
{
result.ReturnCode = ResultCode.InvalidParam;
result.Data = false;
result.ReturnMsg = "请求数据不是multipart/form-data类型";
return result;
} string root = HostingEnvironment.MapPath("/Resources/Templet/");
string date = DateTime.Now.ToString("yyyy-MM-dd");
string resourcePath = Path.Combine(root, date);
if (!Directory.Exists(resourcePath))
{
Directory.CreateDirectory(resourcePath);
} var provider = new RenamingMultipartFormDataStreamProvider(resourcePath);
// 接收数据,并保存文件
var bodyparts = await Request.Content.ReadAsMultipartAsync(provider); if (bodyparts.FormData.Count <= || provider.FileData == null && !provider.FileData.Any())
{
result.ReturnCode = ResultCode.InvalidParam;
result.Data = false;
result.ReturnMsg = "文件或参数不全,视频上传失败。";
return result;
} UploadContactListFileModel uploadModel = new UploadContactListFileModel(); if (bodyparts.FormData.AllKeys.Contains("ContactListName"))
{
uploadModel.ContactListName = bodyparts.FormData["ContactListName"];
} foreach (MultipartFileData file in provider.FileData)
{
//上传的文件名
string name = file.Headers.ContentDisposition.FileName.Replace("\"", "");
string extension = Path.GetExtension(name);
if (extension == ".csv" || extension == ".xls" || extension == ".xlsx")
{
//修改文件名
string newFileName = Guid.NewGuid().ToString("N") + Path.GetExtension(name);
string uploadPath = Path.Combine(resourcePath, newFileName);
//保存文件
File.Move(file.LocalFileName, uploadPath);
uploadModel.FilePath = uploadPath;
break;
}
}
}
catch (Exception ex)
{
result.ReturnMsg = "服务器内部发生异常";
Logger.Error("SelfsController[AddVideos]", ex);
}
return result;
}
model:
public class UploadContactListFileModel
{ /// <summary>
/// FilePath
/// </summary>
public string FilePath { get; set; } /// <summary>
/// ContactListName
/// </summary>
public string ContactListName { get; set; } /// <summary>
/// IsError
/// </summary>
/// <returns></returns>
public bool IsError()
{
return string.IsNullOrEmpty(FilePath) || string.IsNullOrEmpty(ContactListName);
}
}
html:
<form action="/Spread/External/TestFile" method="post" enctype="multipart/form-data">
<input type="text" name="ContactListName" value="ContactListName" /> <br />
<input type="file" name="upload" value="" /><br />
<input type="submit" name="name" value="上传" />
</form>
C# Web Api 上传文件的更多相关文章
- 演示如何通过 web api 上传文件MVC40
演示如何通过 web api 上传文件WebApiWebFormHost/UploadFileController.cs /* * 通过 web api 上传文件 */ using System; u ...
- 返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作
原文:返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, ...
- 前端AngularJS后端ASP.NET Web API上传文件
本篇体验使用AngularJS向后端ASP.NET API控制器上传文件. 首先服务端: public class FilesController : ApiController { //usi ...
- 1.5 WEB API 上传文件
1.前提,设置跨域 2.在控制器头添加允许跨域 /// <summary> /// 文件管理口控制器 /// </summary> [EnableCors("*&qu ...
- HttpClient 测试web API上传文件实例
1.使用HttpClient 测试上传文件并且设置header信息: using Lemon.Common; using Newtonsoft.Json; using System; using Sy ...
- ASP.NET Web API 上传文件
HTML表单: <form id="form1" method="post" enctype="multipart/form-data" ...
- 数据採集之Web端上传文件到Hadoop HDFS
前言 近期在公司接到一个任务.是关于数据採集方面的. 需求主要有3个: 通过web端上传文件到HDFS; 通过日志採集的方式导入到HDFS; 将数据库DB的表数据导入到HDFS. 正好近期都有在这方面 ...
- php 下 html5 XHR2 + FormData + File API 上传文件
FormData的作用: FormData对象可以帮助我们自动的打包表单数据,通过XMLHttpRequest的send()方法来提交表单.当然FormData也可以动态的append数据.FormD ...
- Web API 上传下载文件
1.引用了一个第三方组件 ICSharpCode.SharpZipLib.Zip; 2.具体代码 实体类,可以用hashtable 替代 ,感觉hashtable 比较灵活 public class ...
随机推荐
- apache服务器配置Net的实践
前置: 在xp系统中,打补丁之类或啥子操作引起或多或少的问题,最终导致iis不能使用: 不想装系统...忍着... 最近突发事件导致,需要摸一下apache服务器处理,好吧,那就搜索下吧..... 目 ...
- 译:C#面向对象的基本概念 (Basic C# OOP Concept) 第三部分(多态,抽象类,虚方法,密封类,静态类,接口)
9.多态 Ploy的意思就是多于一种形式.在文章开始,方法那一章节就已经接触到了多态.多个方法名称相同,而参数不同,这就是多态的一种. 方法重载和方法覆盖就是用在了多态.多态有2中类型,一种是编译时多 ...
- 使用SharePoint Designer定制开发员工工作日志系统实例!
昨天已介绍了一篇<使用SharePoint Designer定制开发专家库系统实例!>,今天继续来介绍使用SharePoint Designer定制开发员工工作日志系统实例,主要功能包括填 ...
- 【Android】Handler、Looper源码分析
一.前言 源码分析使用的版本是 4.4.2_r1. Handler和Looper的入门知识以及讲解可以参考我的另外一篇博客:Android Handler机制 简单而言:Handler和Looper是 ...
- c/c++:动态库 静态库 linux/windows 例子 (转)
作者:吴秦出处:http://www.cnblogs.com/skynet/本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接). C++静 ...
- 【分布式】RPC初探
事先声明:本文代码参考自Dubbo作者的博客. RPC(Remote Procedure Call)远程过程调用,是分布式系统当中必不可少的一个玩意.比如说在单机系统当中,我想调用某个方法,直接调就可 ...
- webpack实战
webpack实战 30分钟手把手教你学webpack实战 2015-09-08 23:02 by 龙恩0707, 175 阅读, 0 评论, 收藏, 编辑 30分钟手把手教你学webpack实战 阅 ...
- js中this的四种调用模式
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- ToolBar、ActionBar与Menu的纠葛(以及navigationIcon、setHomeButtonEnabled、setDisplayHomeAsUpEnabled)
因为贴图的繁琐...所以下面是无图版...完整的在这里: 探究一下toobar和actionbar在使用menu时的吊诡情况 一.背景介绍 toolbar最近比较火,而且是出出来代替actionbar ...
- 安装percona-xtrabackup一直提示依赖冲突的一个解决办法
我的Mysql是5.6版本,通过自己下载的rpm包执行安装: yum instal percona-xtrabackup-2.1.7-721.rhel6.x86_64.rpm 会出现如下的安装错误提示 ...