博主的项目,客户端是APP,考虑到以后也可能会应用到微信端、网站等,图片上传方法就需要兼容多端,并且以目前的设计,不允许非登录用户上传图片,就得在上传时解决附带参数上传图片的问题。

先来看看后台方法(逻辑都写在了一起,有点乱,分布式文件系统还没做好,暂时存在了本地...):

         /// <summary>
/// 图片上传 [FromBody]string token
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("api/Upload/ImgUpload")]
public Task<Hashtable> ImgUpload()
{
// 检查是否是 multipart/form-data
if (!Request.Content.IsMimeMultipartContent("form-data"))
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); // 文件保存目录路径
const string saveTempPath = "~/UploadFiles/";
var dirTempPath = HttpContext.Current.Server.MapPath(saveTempPath); // 设置上传目录
var provider = new MultipartFormDataStreamProvider(dirTempPath); var task = Request.Content.ReadAsMultipartAsync(provider).
ContinueWith<Hashtable>(o =>
{
var hash = new Hashtable();
var file = provider.FileData[];
// 最大文件大小
const int maxSize = ;
// 定义允许上传的文件扩展名
const string fileTypes = "gif,jpg,jpeg,png,bmp"; // token验证
var token = string.Empty;
try
{
token = provider.FormData["token"].ToString();
}
catch (Exception exception)
{
throw new Exception("未附带token,非法访问!", exception);
} if (!string.IsNullOrEmpty(token))
{
if (!CacheManager.TokenIsExist(token))
{
throw new UserLoginException("Token已失效,请重新登陆!");
}
if (accountInfoService.Exist_User_IsForzen(AccountHelper.GetUUID(token)))
{
CacheManager.RemoveToken(token);
tempCacheService.Delete_OneTempCaches(new Guid(token));
throw new UserLoginException("此用户已被冻结,请联系管理员(客服)!");
}
}
else
{
throw new Exception("token为空,非法访问!");
} string orfilename = file.Headers.ContentDisposition.FileName.TrimStart('"').TrimEnd('"');
var fileinfo = new FileInfo(file.LocalFileName);
if (fileinfo.Length <= )
{
hash["Code"] = -;
hash["Message"] = "请选择上传文件。";
}
else if (fileinfo.Length > maxSize)
{
hash["Code"] = -;
hash["Message"] = "上传文件大小超过限制。";
}
else
{
var fileExt = orfilename.Substring(orfilename.LastIndexOf('.')); if (String.IsNullOrEmpty(fileExt) ||
Array.IndexOf(fileTypes.Split(','), fileExt.Substring().ToLower()) == -)
{
hash["Code"] = -;
hash["Message"] = "不支持上传文件类型。";
}
else
{
try
{
AttachmentFileResultDTO attachmentFileResult;
attachmentFileService.UploadAttachmentFile(fileinfo, dirTempPath, fileExt,
Path.GetFileNameWithoutExtension(file.LocalFileName), out attachmentFileResult); hash["Code"] = ;
hash["Message"] = "上传成功";
hash["FileId"] = attachmentFileResult.ID;
hash["FileName"] = attachmentFileResult.FileName + attachmentFileResult.FileType;
hash["NetImageUrl"] = attachmentFileResult.FileUrl;
}
catch (Exception exception)
{
throw new Exception("上传失败!", exception);
}
}
}
return hash;
});
return task;
}

注:

1.第31行至57行是对附带参数token进行验证,因为博主的需求是只开放登录用户上传图片

2.第34行一定要tostring(),因为我们的参数也是以二进制数据格式上传的

前台目前是以jquery做的测试,使用了ajaxfileupload.js来上传文件。不过博主下载的ajaxfileupload.js并不支持附带参数上传,不知道是不是没找到好资源,不管了,自己打开文件瞅瞅...源码也不长一两百行,那就自己动手改改呗。(如果你已下载到支持附带参数上传的js,请自动忽略这一部分)

找到createUploadForm这个函数,OK,顾名思义它是用来创建FORM的,看看博主下载版本的源码:

   createUploadForm: function (id, fileElementId) {
//create form
var formId = 'jUploadForm' + id;
var fileId = 'jUploadFile' + id;
var form = jQuery('<form action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"></form>');
var oldElement = jQuery('#' + fileElementId);
var newElement = jQuery(oldElement).clone();
jQuery(oldElement).attr('id', fileId);
jQuery(oldElement).before(newElement);
jQuery(oldElement).appendTo(form);
//set attributes
jQuery(form).css('position', 'absolute');
jQuery(form).css('top', '-1200px');
jQuery(form).css('left', '-1200px');
jQuery(form).appendTo('body');
return form;
},

我们添加参数data,并在第5行后面插入下列代码:

       if (data) {
for (var i in data) {
if (data.hasOwnProperty(i)) {
jQuery('<input type="hidden" name="' + i + '" value="' + data[i] + '" />').appendTo(form);
}
}
}

再找到调用这个函数的地方,ajaxFileUpload函数中有这样一行:

var form = jQuery.createUploadForm(id, s.fileElementId);

OK,修改成我们重构后的调用:

var form = jQuery.createUploadForm(id, s.fileElementId,(typeof(s.data) == 'undefined' ? false : s.data));

到这一步,我们就可以jquery调用ajaxfileupload执行文件上传并且附带参数了。

    $.ajaxFileUpload({
url: "/api/Upload/ImgUpload",
secureuri: false,
fileUpload: file,
dataType: 'json',
data: { "token": token },
success: function (data, status) {
var str = $(data).text();
var result = JSON.parse(str);
successFn(result, key);
}, error: function (data, status, e) {
failFn();
}
});

具体的ajaxfileupload.js下载路径:http://download.csdn.net/detail/cb511612371/9173749

附上做测试随意写的文件上传通用方法一份,可能有点丑...求轻喷(会有部分逻辑是博主测试的功能需求决定的,如使用,请自己过滤处理)

 //图片上传
window.proHub = {};
common = {};
/**================================================================
文件上传
=================================================================*/
common.uploadTemplate = '<li class="fl pr">' +
'<div class="plus abs-mm fullLayer">' +
'<span class="abs-mm"></span>' +
'<span class="abs-mm"></span>' +
'</div>' +
'<img class="abs-mm hidden"/>' +
'<input class="file-input" type="file" name="file{0}" accept="image/*" onchange="fileUploadChange(this);"/>' +
'<div class="file-img-del hidden"></div>' +
'</li>'; // 文件上传
common.fileIndex = ;
// 添加文件上传框
common.appendFileUpload = function ($container, imgData, key) {
var h = "hidden"; var $list = $container.find("li");
var t = $container.attr("limit");//
var len = t === undefined ? : t;//
var canAdd = len != $list.length;
var $prev = $container.find("li:last");
var str = common.uploadTemplate; // 执行上传
if ($.trim($container.html()).length > ) {
common.uploadImage(uploadResult, $container);
} imgData && ($prev.find("img").removeClass(h).get().src = imgData);
$prev.find(".plus").addClass(h);
$prev.find("[type=file]").addClass(h);
$prev.find(".file-img-del").removeClass(h);
canAdd && $container.append(str.format(common.fileIndex)); common.fileIndex++;
} // 上传文件控件change
function fileUploadChange(fileControl) {
var imgClass = ".img-preview-list";
var h = "hidden";
viewFile(fileControl); function viewFile(fileControl) {
var file = fileControl.files[]; var reader = new FileReader();
reader.onload = function (evt) {
var data = evt.target.result;
var $par = $(fileControl).parents(imgClass);
common.appendFileUpload($par, data);
}
reader.readAsDataURL(file);
}
} // 上传成功和删除图片回调方法
var imgUrl = { "head_img": null, "card_zheng": null, "card_fan": null, "certificate": null, "license": null };
uploadResult = function (fileId, key) {
imgUrl[key] = fileId;
// 点击查看大图
$(".openPhoto img").click(function () {
$("#big_photo").attr("src", $(this).attr("src"));
$.fancybox.open($("#panel"));
});
} common.uploadImgInit = function () {
var imgClass = ".img-preview-list";
var $box = $(imgClass); $box.on("click", ".file-img-del", function () {
var $par = $(this).parents(imgClass);
var len = $par.find("li").length;
if (len == ) {
var str = common.uploadTemplate;
$par.append(str);
}
uploadResult(null, $par.attr("key"));
$(this).parent().remove();
}); $box.each(function (index, item) { common.appendFileUpload($(item));
});
}; // 上传图片到服务器
common.uploadImage = function (submit, $box) {
var files = $box.find("[type=file]");
var count = ;
var imgKey = $box.attr("key");
var map = {}; $(files).each(function (index, item) {
if (item.files.length) {
imgKey = $(this).parent().parent().attr("key");
count++;
proHub.uploadImage(item, successFn, failFn, imgKey);
}
});
if (!count) {
submit();
}
var curIndex = ;
function successFn(result, key) {
if (result.Code == ) {
map[key] = result["FileId"];
curIndex++; if (curIndex == count) {
submit(map[key], key);
}
} else {
Config.Method.JudgeCode(result, );
}
} function failFn() {
alert("图片上传失败,请重试!");
$(".file-img-del").click();
}
} proHub.uploadImage = function (file, successFn, failFn, key) {
$.ajaxFileUpload({
url: "/api/Upload/ImgUpload",
secureuri: false,
fileUpload: file,
dataType: 'json',
data: { "token": token },
success: function (data, status) {
var str = $(data).text();
var result = JSON.parse(str);
successFn(result, key);
}, error: function (data, status, e) {
failFn();
}
});
};

如果有写的不好或不对的地方,欢迎指出,必定及时纠正,虚心请教。

原创文章,代码都是从自己项目里贴出来的。转载请注明出处哦,亲~~~

.NET WebAPI 实现图片上传(包括附带参数上传图片)的更多相关文章

  1. .NET MVC实现多图片上传并附带参数(ajaxfileupload)

    做网站呢,都免不了要做图片上传. 还记得去年做微信的时候用WebAPI+ajaxfileupload.js做了一个能够附带参数上传的功能,博文地址:.NET WebAPI 实现图片上传(包括附带参数上 ...

  2. IOS5开发-http get/post调用mvc4 webapi互操作(图片上传)[转]

    IOS5开发-http get/post调用mvc4 webapi互操作(图片上传)   目前最流行的跨平台交互是采用http协议通过JSON对象进行互操作.这种方式最简单,也很高效.webservi ...

  3. thinkphp3.2.3 ueditor1.4.3 图片上传操作,在线删除上传图片功能。

    最近弄一个图片 上传,可是用ueditor 自带的上传,如果不配置的话,上传的目录不在自己的项目中. 在网上找了好多,可是都是底版本的,新版本的还真是找到了一个,ueditor-thinkphp 这个 ...

  4. Dynamics CRM 365中结合注释和WebApi实现图片上传

    首先需要在实体上使用注释,然后在窗体上引用WebResource. WebResource的代码: <!DOCTYPE html> <html> <head> &l ...

  5. 关于富文本编辑器—UEditor(java版)的使用,以及如何将UEditor的文件/图片上传路径改成绝对路径

    突然发现好久没写博客了,感觉变懒了,是要让自己养成经常写文章的习惯才行.既可以分享自己的所学,和所想,和大家一起讨论,发现自己的不足的问题. 大家可能经常会用到富文本编辑器,今天我要说的是UEdito ...

  6. springMVC3 ckeditor3.6 图片上传 JS回调

    一.引入js文件 <script type="text/javascript" src="<%=base %>/resources/ckeditor/c ...

  7. dedecms图片上传函数

    /** * 图片上传类 * @param $file上传图片信息 * @param $ty */ function upload_pic($file, $ty) { if (!is_uploaded_ ...

  8. 微信小程序--问题汇总及详解之图片上传和地图

    地图用的是百度的地图,链接:http://lbsyun.baidu.com/index.php?title=wxjsapi/guide/getlocation 获取日期时间可以用小程序里自带的js文件 ...

  9. 百度ueditor vue项目应用 -- 图片上传源码修改

    本文目的有两个,一.废掉单图上传,二.改造多图上传 大家都知道百度ueditor不是针对vue项目开发的,官方文档提供的源码包里有需要后端配置的接口,but到vue项目就不太好办了,网上有些文章也介绍 ...

随机推荐

  1. php的laravel框架快速集成微信登录

    最终的解决方案是:https://github.com/liuyunzhuge/php_weixin_provider,详细的介绍请往下阅读. 本文面向的是php语言laravel框架的用户,介绍的是 ...

  2. Linux零起点之进程管理----c语言编程

    进程 (Process)是指操作系统中被加载到内存中的.正在运行的应用程序实例.进程是系统资源分配的基本单元,在其生命周期内会使用系统中的各种资源.进程主要由程序.数据以及进程控制快(PCB)3个部分 ...

  3. linux中字体的安装以及Terminal字体重叠问题解决

    安装wps的时候,经常会提示你系统字体缺失,这些字体网上都有,就不分享了,直接讲安装吧. 就比如这个Wingdings字体,在字体目录中新建一个目录Wingdings,将ttf字体文件复制进去,在终端 ...

  4. maven之一:maven安装和eclipse集成

    maven作为一个项目构建工具,在开发的过程中很受欢迎,可以帮助管理项目中的bao依赖问题,另外它的很多功能都极大的减少了开发的难度,下面来介绍maven的安装及与eclipse的集成. maven的 ...

  5. [FromBody]与[FromUrl]

    我们都知道,前台请求后台控制的方法有get方法和post方法两种, get:只支持ulr传数据,不管你是手动把参数拼接在Url里面还是写在data里面,只要是用get方法,都会自动绑定到url里面的形 ...

  6. VS2012 Unit Test——Microsoft Fakes入门

    如题,本文主要作为在VS2012使用Fakes的入门示例,开发工具必须是VS2012或更高版本. 关于Fakes的MSDN地址:http://msdn.microsoft.com/en-us/libr ...

  7. 用drawRect的方式实现一个尺子

    用drawRect的方式实现了一个尺子选择器,demo在这里:https://github.com/Phelthas/LXMRulerView 效果如图:   如果不考虑复用的问题,我感觉最简单的实现 ...

  8. iOS开发:创建真机调试证书及描述文件

    iOS开发:创建真机调试证书及描述文件 关于苹果iOS开发,笔者也是从小白过来的,经历过各种困难和坑,其中就有关于开发证书,生产证书,in_house证书,add_Hoc证书申请过程中的问题,以及上架 ...

  9. 关于Apache Spark

    Apache Spark :  https://www.oschina.net/p/spark-project

  10. Junit单元测试

    写一个被测试的类 这是类中的一些方法,将一个16进制转化为10进制 reckon()为转化的主要方法,返回结果为10进制数 judge()判断字符是否在0-9,A-F之间,并将字符转化为0-15之中的 ...