制作这个功能时,找了很多资料,不过忘记了地址,所以就不一一放连接了,

直接上代码吧!

1. 首先新建一个上传的控制器

    

  /// <summary>

  /// 上传

  /// </summary>

  [RoutePrefix("api/Upload")]

  public class UploadController : ApiController

2. 有控制器了,肯定要有一个接受的地方

  /// <summary>
  /// 上传图片
  /// </summary>
  /// <returns></returns>
  /// <exception cref="System.Web.Http.HttpResponseException"></exception>
  [HttpPost, Route("Image")]
  public async Task<HttpResponseMessage> Post()

3. 重要代码,自己扩展(重写) MultipartFormDataStreamProvider  类

   // We implement MultipartFormDataStreamProvider to override the filename of File which

// will be stored on server, or else the default name will be of the format like Body-

// Part_{GUID}. In the following implementation we simply get the FileName from

// ContentDisposition Header of the Request Body.

public class CustomMultipartFormDataStreamProvider : MultipartFormDataStreamProvider

{

/// <summary>

/// 用户编号由于生产用户图片的前缀

/// <para>如用户为 01,01-12345467878</para>

/// </summary>

public string UserId { get; set; }

/// <summary>

/// 图片名称

/// </summary>

public string ImageName { get; set; }

/// <summary>

/// Initializes a new instance of the <see cref="CustomMultipartFormDataStreamProvider"/> class.

/// </summary>

/// <param name="userId">The user identifier.</param>

/// <param name="imageName"></param>

/// <param name="path">The path.</param>

public CustomMultipartFormDataStreamProvider(string userId, string imageName, string path)

: base(path)

{

this.UserId = userId;

this.ImageName = imageName;

}

/// <summary>

/// 获取本地文件名,该文件名将与用于创建存储当前 MIME 正文部分内容的绝对文件名的根路径组合在一起。

/// </summary>

/// <param name="headers">当前 MIME 正文部分的标头。</param>

/// <returns>

/// 不包含路径部分的相对文件名。

/// </returns>

public override string GetLocalFileName(HttpContentHeaders headers)

{

// 保存的图片名称

var serverImageName = "";

if (!string.IsNullOrEmpty(serverImageName))

{

serverImageName = this.ImageName;

}

else

{

// 新增时获取文件名

serverImageName = headers.ContentDisposition.FileName.Replace("\"", string.Empty);

// 用 .  拆分

// 取最后的图片类型

var splitArr = serverImageName.Split('.');

var nowTime = DateTime.Now.ToString("yyyyMMdd");

serverImageName = this.UserId + "-" + nowTime + "." + splitArr.LastOrDefault();

}

return serverImageName;

}

}

4. 类中所有的源代码都在下面:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http; namespace Payu_File.Controllers
{
/// <summary>
/// 上传
/// </summary>
[RoutePrefix("api/Upload")]
public class UploadController : ApiController
{
/// <summary>
/// 上传图片
/// </summary>
/// <returns></returns>
/// <exception cref="System.Web.Http.HttpResponseException"></exception>
[HttpPost, Route("Image")]
public async Task<HttpResponseMessage> Post()
{
// Check whether the POST operation is MultiPart?
// 检查该请求是否含有multipart/form-data
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
} // 检测文件大小
var request = HttpContext.Current.Request; // 图片文件
var imageFile = request.Files.Get(0); // 图片文件名称
var imageFileName = imageFile.FileName; // 图片文件内容类型
var imageFileType = imageFile.ContentType.ToLower(); var imageTypeList = new List<string>() { "gif", "jpg", "jpeg", "png", "bmp" }; // 检测类型
if (!imageFileType.Contains("image/") || !imageTypeList.Contains(imageFileName.Split('.').LastOrDefault()))
{
return Request.CreateResponse(HttpStatusCode.OK, new { Success = false, Message = "请上传图片格式的文件,如:gif,jpg,jpeg,png,bmp 结尾的文件" });
} // 检测文件大小
// 最大为 10M
if (imageFile.ContentLength >= 10485760)
{
return Request.CreateResponse(HttpStatusCode.OK, new { Success = false, Message = "图片大小不能超过 10M" });
} // 检测是否有用户编号
if (!request.Form.AllKeys.Contains("UserId"))
{
return Request.CreateResponse(HttpStatusCode.OK, new { Success = false, Message = "用户还未登录" });
} // 图片名称
// 用于替换同名的文件
var imageName = ""; // 检测是否有
if (request.Form.AllKeys.Contains("ImageName"))
{
imageName = request.Form.Get("ImageName");
}
// 用户编号
// 用户生成用户图片的前缀
var userId = request.Form.Get("UserId"); if (string.IsNullOrEmpty(userId))
{
return Request.CreateResponse(HttpStatusCode.OK, new { Success = false, Message = "用户还未登录" });
}
// 文件路径
// 默认为 Imager/Portrait
var filePath = "Images/Portrait"; // 如果指定图片路径,那么将以指定的路径存储
if (request.Form.AllKeys.Contains("ImageFilePath"))
{
var tempPath = request.Form.Get("ImageFilePath"); if (!String.IsNullOrEmpty(tempPath))
{
filePath = tempPath;
}
} // Prepare CustomMultipartFormDataStreamProvider in which our multipart form
// data will be loaded.
var fileSaveLocation = HttpContext.Current.Server.MapPath("~/" + filePath); var provider = new CustomMultipartFormDataStreamProvider(userId, imageName, fileSaveLocation); var files = new List<string>(); try
{
// Read all contents of multipart message into CustomMultipartFormDataStreamProvider.
await Request.Content.ReadAsMultipartAsync(provider); files.AddRange(provider.FileData.Select(file => Path.GetFileName(file.LocalFileName))); // Send OK Response along with saved file names to the client.
return Request.CreateResponse(HttpStatusCode.OK, new { Success = true, Message = "上传成功!", ImageName = files.FirstOrDefault() });
}
catch (Exception e)
{
return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
}
}
} // We implement MultipartFormDataStreamProvider to override the filename of File which
// will be stored on server, or else the default name will be of the format like Body-
// Part_{GUID}. In the following implementation we simply get the FileName from
// ContentDisposition Header of the Request Body.
public class CustomMultipartFormDataStreamProvider : MultipartFormDataStreamProvider
{
/// <summary>
/// 用户编号由于生产用户图片的前缀
/// <para>如用户为 01,01-12345467878</para>
/// </summary>
public string UserId { get; set; } /// <summary>
/// 图片名称
/// </summary>
public string ImageName { get; set; } /// <summary>
/// Initializes a new instance of the <see cref="CustomMultipartFormDataStreamProvider"/> class.
/// </summary>
/// <param name="userId">The user identifier.</param>
/// <param name="imageName"></param>
/// <param name="path">The path.</param>
public CustomMultipartFormDataStreamProvider(string userId, string imageName, string path)
: base(path)
{
this.UserId = userId; this.ImageName = imageName;
} /// <summary>
/// 获取本地文件名,该文件名将与用于创建存储当前 MIME 正文部分内容的绝对文件名的根路径组合在一起。
/// </summary>
/// <param name="headers">当前 MIME 正文部分的标头。</param>
/// <returns>
/// 不包含路径部分的相对文件名。
/// </returns>
public override string GetLocalFileName(HttpContentHeaders headers)
{
// 保存的图片名称
var serverImageName = ""; if (!string.IsNullOrEmpty(serverImageName))
{
serverImageName = this.ImageName;
}
else
{
// 新增时获取文件名
serverImageName = headers.ContentDisposition.FileName.Replace("\"", string.Empty); // 用 . 拆分
// 取最后的图片类型
var splitArr = serverImageName.Split('.'); var nowTime = DateTime.Now.ToString("yyyyMMdd"); serverImageName = this.UserId + "-" + nowTime + "." + splitArr.LastOrDefault();
} return serverImageName;
}
}
}

  

Web Api 上传图片,解决上传图片无格式的更多相关文章

  1. 解决.NET Web API生成的Help无Controller说明&服务端接收不到请求

    今天在用.NET Web API写一个接口的时候遇到一个问题.在Controller中新加了一个方法,客户端就不能请求接口了,当时建WEB API项目是用的VS默认设置,在服务端打断点一直没有进去,而 ...

  2. 让ASP.NET Web API支持POST纯文本格式(text/plain)的数据

    今天在web api中遇到了这样一个问题,虽然api的参数类型是string,但只能接收post body中json格式的string,不能接收原始string. web api是这样定义的: pub ...

  3. 用Ajax调用web api,解决URL太长的问题;

    本来是用的WCF,但是服务需要多种方式调用(后台+前端Ajax),最终局面就是我在WCF每个服务中都判断一下↓ #region 解决接收不到Ajax中传来的参数... if (jsonParames ...

  4. ASP.NET Web API 2.0 统一响应格式

    传统实现 在搭建 Web API 服务的时候,针对客户端请求,我们一般都会自定义响应的 JSON 格式,比如: { "Data" : { "Id" : 100, ...

  5. [Web API] 如何让 Web API 统一回传格式以及例外处理[转]

    [Web API] 如何让 Web API 统一回传格式以及例外处理 前言 当我们在开发 Web API 时,一般的情况下每个 API 回传的数据型态或格式都不尽相同,如果你的项目从头到尾都是由你一个 ...

  6. [Web API] 如何让 Web API 统一回传格式以及例外处理

    [Web API] 如何让 Web API 统一回传格式以及例外处理 前言 当我们在开发 Web API 时,一般的情况下每个 API 回传的数据型态或格式都不尽相同,如果你的项目从头到尾都是由你一个 ...

  7. "Asp.Net Web Api MediaTypeFormatter Error for x-www-formurlencoded data" 解决方法

    遇到标题中所说的问题原因是使用 jQuery AJAX 以 POST 方式调用 Asp.Net Web API .解决办法请看以下代码中有注释的部分. public static class WebA ...

  8. Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群

    Redis总结(五)缓存雪崩和缓存穿透等问题   前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...

  9. Web API系列(二)接口安全和参数校验

    以前简单介绍过web api 的设计,但是还是有很多朋友问我,如何合理的设计和实现web api.比如,接口安全,异常处理,统一数据返回等问题.所以有必要系统的总结总结 web api 的设计和实现. ...

  10. 集成架构:对比 Web API 与面向服务的架构和企业应用程序集成(转)

    http://kb.cnblogs.com/page/521644/ 摘要:总体上讲,SOA 和 Web API 似乎解决的是同一个问题:以实时的.可重用的方式公开业务功能.本教程将分析这些举措有何不 ...

随机推荐

  1. 浮动框控制及切换、banner随机数js

    1.浮动置控制及切换 <div class="banner1"></div><div class="bot_banner"> ...

  2. SSM框架学习之高并发秒杀业务--笔记3-- Service层

    上一节中已经包DAO层编写完成了,所谓的DAO层就是所有和数据访问的部分都应该放在这个层里,它负责与数据库打交道.对于一个web项目来说,大概由这几部分组成: 1. 前台的显示层. 2. 分发处理请求 ...

  3. ios打包

    ios7.1及以上 itms-services://?spm=0.0.0.0.WIsvD2&action=download-manifest&url=https://mtl.aliba ...

  4. iOS开发UI篇—UITableview控件基本使用

    iOS开发UI篇—UITableview控件基本使用 一.一个简单的英雄展示程序 NJHero.h文件代码(字典转模型) #import <Foundation/Foundation.h> ...

  5. 关于MVC

    MVC,或多或少都有听说过.这个模式在客户端程序里面比较常见.以前有人老说mvc是什么设计模式之类.至少我理解的不是.我觉得 MVC是一种模块划分方法.根据它,我们可以快速地划分单独某个模块.比如排行 ...

  6. SQL 解决in的参数烦恼(经典,简洁,高效)

    原SQL是不能执行的:select * from 表A where 字段A in (select 逗号分隔的字段B from 表B where 条件) 解决方案:select b.* from (se ...

  7. css3 弹框功能样式

    .message-box{ position: fixed; top: 0; right: 0; bottom: 0; left: 0; background-color: rgba(0, 0, 0, ...

  8. Qt Creator提示"Qt没有被正确安装,请运行make install"的解决办法

    笔者最近使用Qt在开发一些小程序,觉得这个框架设计确实很好,使用了信号和槽解决了组件之间的通讯问题,可以说是基于C++语言上一个非常大的创新,大大提高了开发人员的编码效率,也使整个C++语言更加抽象. ...

  9. cocos2dx 3.0 之 lua 创建类

    利用3.0里面封装好的模板类来写,不罗嗦,直接上例子(消除星星小游戏中 星星类) require "extern" StarSprite = class("StarSpr ...

  10. error :ld returned 1 exit status

    额,被调用函数的名称与调用函数的名称写的不一致啊: 所以会出现 ld returned 1 exist status 好了, 问题解决了.