长时间没有接触mvc,有点生疏了,这次mvc上传图片功能完成后,简单地总结下。

我围绕这三块介绍,首先是前台form表单

<style>
#file_name {
width: 400px;
height: 30px;
} a.inputFileBrowser {
width: 50px;
height: 34px;
line-height: 34px;
background: #3091d1;
text-align: center;
display: inline-block; /*具有行内元素的视觉,块级元素的属性 宽高*/
overflow: hidden; /*去掉的话,输入框也可以点击*/
position: relative; /*相对定位,为 #file 的绝对定位准备*/
border-radius: 3px;
left: 3px;
text-decoration: none;
color: #FFF;
} a.inputFileBrowser:hover {
background: #31b0d5;
color: #ffffff;
} #file {
opacity:; /*设置此控件透明度为零,即完全透明*/
filter: alpha(opacity=0); /*设置此控件透明度为零,即完全透明针对IE*/
font-size: 100px;
position: absolute; /*绝对定位,相对于 .input */
top:;
right:;
}
</style>
<form id="form1" enctype="multipart/form-data">
<input class="form-control" type="text" id="file_name" readonly="readonly" value="" style=" background:#fff; height:34px; line-height:34px;">
<a href="javascript:void(0);" class="inputFileBrowser">
浏览
<input type="file" id="file" name="File">
</a>
<button id="saveCover" class="btn btn-primary" style="margin-left:5px; position:relative; top:-14px;">上传</button>
<div id="result"></div>
<div id="divError" class="alert alert-danger" style="display:none; margin-bottom:0px;"></div>
</form>

1、form表单必须加enctype属性,它默认值:application/x-www-form-urlencoded,也是post提交数据的时候,我们经常指定的Content-Type的值。数据将以键值对发送。上传文件时,它的值:multipart/form-data,用来上传二进制文件。

2、由于我们对input  type=“file” 文件上传控件无法自定义样式,因此,这里有个投机取巧的实现,原理:改变该控件的透明度,用a连接把file包在里面,然后用一个文本框来显示file控件选择的值。

这样就得用js控制显示:

  $(function () {
$("#file").change(function () {
var fileSize = this.files[0].size;
var size = fileSize / 1024 / 1024;
if (size > 4) {
alert("图片不能大于4M,请处理后重新上传!");
this.value = "";
return false;
} else { $("#file_name").val($("#file").val().replace("C:\\fakepath\\",""));
}
})
});

由于浏览器考虑到安全问题,所以我们不能直接把客户端的文件路径取出来,其实这里又有一个”投机取巧”的实现,webkit内核的浏览器就是这么干的,直接显示文件名,而不显示路径。我把路径给替换为空了(真实的路径被浏览器替换为虚假的路径)。

  到此为止,图片上传的前台部分,还没有结束。form表单提交有个讨厌的地方,就是你不想提交后,让它跳转,也不想提交后,地址栏发生任何变化。然而这一切,还得我们自己处理。我用到了form提交的jquery插件:jquery.form.js,接下来,该ajax出场了。我的目标是上传一张图片,然后及时地预览。

 $('#saveCover').click(function (event) {
event.preventDefault();
$("#form1").ajaxSubmit(
{
url: '/AcademicPublish/UploadCover',
type: 'post',
cache: false,
success: function (result) {
if (result.IsSuccess) {
$("#CoverImg").val(result.FilePath);
$("#result").html("<img src='" + result.FilePath + "'/>");
}
},
fail: function (jqXHR, textStatus, errorThrown) {
$("#divError").show();
$("#divError").html("图像保存失败。");
} })
});

  event.preventDefault() 这句非常关键,如果没有的话,form提交后,地址栏会出现图片名称等一系列参数,尽管我们用的是post提交方式。还有另外一点值的注意,如果我们把图片保存在客户端的其它地方,而不是项目的路径下,那么页面上是拒绝显示图片的。

前台的实现是重点,后台的实现其实比较简单:

         /// <summary>
/// 上传封面
/// </summary>
[AllowAnonymous]
[HttpPost]
public ActionResult UploadCover()
{
HttpPostedFileBase image = Request.Files["File"];
if (image != null && image.ContentLength > )
{
string fileName = DateTime.Now.ToString("yyyyMMdd") + "-" + Path.GetFileName(image.FileName); string baseDir = "/Content/files/Covers";
string imgpath = Server.MapPath("~" + baseDir);
if (System.IO.Directory.Exists(imgpath) == false) //如果不存在就创建file文件夹
{
System.IO.Directory.CreateDirectory(imgpath);
}
string filePath = Path.Combine(imgpath, fileName);
image.SaveAs(filePath); var imagePath = Path.Combine(baseDir, fileName); return Json(new { IsSuccess = true, FilePath = imagePath });
}
else
{
return Json(new { IsSuccess = false, FilePath = "" });
} }
调用HttpPostedFileBaseSaveAs方法即可。假如我们把图片保存到项目以外的地方,还想在前台显示图片,怎么办呢?我们用FileStream读取图片,取得二进制内容,可以考虑base64,当然有其它方法,比如专门请求图片,最后Response.Write,输出二级制文件内容。

mvc上传图片的更多相关文章

  1. Asp.Net MVC 上传图片到数据库

    [读书笔记]Asp.Net MVC 上传图片到数据库(会的绕行)   之前上传图片的做法都是上传到服务器上的文件夹中,再将url保存到数据库.其实在MVC中将图片上传到数据库很便捷的事情,而且不用去存 ...

  2. Asp.Net MVC上传图片

    mvc上传图片 [HttpPost] public JsonResult Upload() { ) { ) { HttpPostedFileBase file = Request.Files[]; ) ...

  3. 【读书笔记】Asp.Net MVC 上传图片到数据库(会的绕行)

    之前上传图片的做法都是上传到服务器上的文件夹中,再将url保存到数据库.其实在MVC中将图片上传到数据库很便捷的事情,而且不用去存url了.而且这种方式支持ie6(ie6不支持jquery自动提交fo ...

  4. 利用Spring MVC 上传图片文件

    本文转自:http://amcucn.iteye.com/blog/264457.感谢作者 近日在工作当中,需要用到上传图片的功能,然而自己平时学习的时候只会使用struts的上传功能,但因为项目并没 ...

  5. mvc上传图片(上传和预览)webuploader

    笔者看到mvc最近比较流行,而很多使用一些比较旧的的方法上传图片,再次安利一下百度的webuploader控件吧 webuploader第一步要先下载一些插件这点可以在webuploader官网上下载 ...

  6. asp.net MVC上传图片完整方法

    图片上传 自动创建文件夹并重命名(带缩略图) 后台: [HttpPost] public ActionResult WanSell_UploadPicture(ProductGalleryModels ...

  7. spring mvc上传图片

    1.需要commons-fileupload.jar commons-io.jar 2.需要在springmvc.xml中 配置存放静态资源的路径,对图片等静态资源放行 <mvc:resourc ...

  8. asp.net mvc上传图片案例

    1.放在ajax.BeginForm里,不好使,同asp.net 表单中 fileupload控件不支持ajax差不多吧,如果异步的话可以借助jquery.form.js,很方便 2. //上传文件  ...

  9. ASP.NET MVC上传图片的奇怪问题

    本文来源于博客园-钱智慧,转载请注明出处 表现:客户说就华为的手机有问题,而且是在QQ里打开有问题,如果在手机的浏览器上,则可以正常上传图片. 有问题的代码如下: private ResultMode ...

随机推荐

  1. Erlang和Web

    Erlang和Web 本文译自: http://ninenines.eu/docs/en/cowboy/1.0/guide/erlang_web/ Web是并发的 当你访问一个网站,很少有并发.几个连 ...

  2. linux下D盘(适用于U盘、硬盘等一切移动存储设备)策略(比格式化猛,因为是不可恢复!)

    关于这样的资料,在百度上还是比较少的,今天就共享出来,在电脑主机上插上你的U盘,输入以下命令: dd if=/dev/zero of=/dev/sdb  bs=1024 count=102400   ...

  3. 关于gcc的一点小人性化提示

    现在对于大多数平台的C编译器来说都会有很多种选择,而gcc和clang无疑是2个非常优秀的C编译器.当然他们也不只是C编译器.我最近用clang的比较多,原因有很多.不过一些小的细节很让我喜欢,比如O ...

  4. ZeroMQ 教程 001 : 基本概览

    介绍性的话我这里就不翻译了, 总结起来就是zmq很cool, 你应该尝试一下. 如何安装与使用zmq 在Linux和Mac OS上, 请通过随机附带的包管理软件, 或者home brew安装zmq. ...

  5. VS Code python初体验笔记

    之前一直都是使用Notepad++来编写Python代码,后来想起来之前查资料的时候有个VS Code可以编写一些的脚本语言(js,node.js)甚至是高级编程语言(C#,PHP,JAVA,Pyth ...

  6. Python Selenium之异常处理

    自动化测试执行过程中,难免会有错误/异常出现,比如测试脚本没有发现对应元素,则会立刻抛出NoSuchElementException异常.这时不要怕,肯定是测试脚本或者测试环境哪里出错了!那如何处理才 ...

  7. Fiddler抓包使用教程-Android应用抓包

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/74439165 本文出自[赵彦军的博客] Fiddler 也可以支持对手机应用进行 ...

  8. Ocelot中文文档-认证

    为了验证ReRoutes并随后使用Ocelot的任何基于声明的功能,如授权或使用令牌中的值修改请求. 用户必须像往常一样在他们的Startup.cs中注册认证服务,但他们给每个注册提供了一个方案(认证 ...

  9. 使用Navicat连接阿里云服务器上的MySQL数据库--转

    手把手教你如何正确连接阿里云服务器上的数据库: 1.首先打开Navicat,文件>新建连接>MySQL连接,其他的如一图所示. 2.因为是连接服务器上的MySQL,所以我们使用SSH连接, ...

  10. Java并发-任务执行

    大多数的应用程序都是围绕"任务执行"来构造的:任务常常是一些抽象的并且离散的工作单元.我们把应用程序的工作分解到多个任务中,可以简化程序的组织结构,提供一种自然的事物便捷来优化错误 ...