博主的项目,客户端是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. WebUtils-网络请求工具类

    网络请求工具类,大幅代码借鉴aplipay. using System; using System.Collections.Generic; using System.IO; using System ...

  2. C# 之 EXCEL导入导出

    以下方式是本人总结的一些经验,肯定有很多种方法,在此先记下,留待以后补充... 希望朋友们一起来探讨相关想法,请在下方留言. A-1:EXCEL模板导出 非常简单,将EXCEL模板上传到项目中后,将其 ...

  3. 有点激动,WPF换肤搞定了!

    一如既往没废话! wpf桌面应用开发都是window内引入很多个UserControl. 如果你有通过不同颜色来换肤的需求,那么下面我就将整个过程! 分2个步骤: 1.主窗体背景色替换: 2.同时界面 ...

  4. 遭遇Web print

    一直都知道Web打印还不太成熟,以前IE横行时,普遍都是采用打印相关的ActiveX控件,有些国产厂家做得不错,只是那时还没有付费能力,没有太多关注.而纯粹基于Web标准的打印,浏览器对CSS pri ...

  5. 如何实现一个php框架系列文章【3】支持psr4的自动加载类

    psr4自动加载规范https://github.com/PizzaLiu/PHP-FIG/blob/master/PSR-4-autoloader-cn.md 我们把第三方使用psr规范的类库放在v ...

  6. Java - I/O

    File类 java.io 操作文件和目录,与平台无关.具体的常用实例方法: File file = new File("."); // 以当前路径创建名为 ".&quo ...

  7. hibernate -- HQL语句总结

    1. 查询整个映射对象所有字段 //直接from查询出来的是一个映射对象,即:查询整个映射对象所有字段 String hql = "from Users"; Query query ...

  8. linux下操作问题与总结

    一. 出现问题 :从服务器244里拷贝ajun文件到自己linux下, 出现ajun: not a regular file?      解决方案:在进行scp传输“文件夹”的时候,加上参数r. 二. ...

  9. .NET Core 2.0版本预计于2017年春季发布

    英文原文: NET Core 2.0 Planned for Spring 2017 微软项目经理 Immo Landwerth 公布了即将推出的 .NET Core 2.0 版本的细节,该版本预计于 ...

  10. hello,world!

    我是马燕,在2017即将来临之际,我希望自己,在新的一年里,能开开心心,健健康康,家人平平安安! 我会努力工作,努力学习,离自己的理想越来越接近. 以后我会将我的所学所得写在这里,供未来的自己随时查看 ...