AJAX实现图片预览与上传及生成缩略图的方法

要实现功能,上传图片时可以预览,因还有别的文字,所以并不只上传图片,实现与别的文字一起保存,当然上来先上传图片,然后把路径和别的文字一起写入数据库;同时为 图片生成缩略图,现只写上传图片方法,文字在ajax里直接传参数就可以了,若要上传多图,修改一下就可以了。

借鉴了网上资料,自己写了一下,并不需要再新加页面,只在一个页面里就OK啦。

JS代码:

//ajax保存数据,后台方法里实现此方法
function SaveData() { 
    filename = document.getElementById("idFile").value;
    result =test_test_aspx.SaveData(filename).value;
    if (result) {
      alert("保存成功!");
    }
    return false;
  }
//实现预览功能
  function DrawImage(ImgD) {
    var preW = 118;
    var preH = 118;
    var image = new Image();
    image.src = ImgD.src;
    if (image.width > 0 && image.height > 0) {
      flag = true;
      if (image.width / image.height >= preW/ preH) {
        if (image.width > preW) {
          ImgD.width = preW;
          ImgD.height = (image.height * preW) / image.width;
        }
        else {
          ImgD.width = image.width;
          ImgD.height = image.height;
        }
        ImgD.alt = image.width + "x" + image.height;
      }
      else {
        if (image.height > preH) {
          ImgD.height = preH;
          ImgD.width = (image.width * preH) / image.height;
        }
        else {
          ImgD.width = image.width;
          ImgD.height = image.height;
        }
        ImgD.alt = image.width + "x" + image.height;
      }
    }
  }
//当idFile内容改变时
  function FileChange(Value) {
    flag = false;
    document.getElementById("showImg").style.display = "none";
    document.getElementById("idImg").width = 10;
    document.getElementById("idImg").height = 10;
    document.getElementById("idImg").alt = "";
    document.getElementById("idImg").src = Value;
  } 

以下为前台代码:

<div class="cbs">
<div class="l"><label>图片:</label></div>
<div>
  <input id="idFile" name="pic" type="file" runat="server" onchange="FileChange(this.value);" />
</div>
    </div>
    <div class="cbs">
<div class="l"><label>预览:</label></div>
<div>
  <img id="idImg" height="0" width="0" src="" alt="" onload="DrawImage(this);" /> //实现预览
  <img id="showImg" width="118" height="118" alt="" runat="server" style="display:none"/>  //加这个主要是为了实现查看时显示图片,因为上面的(idImg)加上runat="server" 报错,如有好的方法可以留言
</div>
</div>    

以下为AJAX方法:

[Ajax.AjaxMethod()]
public bool SaveData(string fileNamePath)
{
  string serverFileName = "";
  string sThumbFile = "";
  string sSavePath = "~/Files/";
  int intThumbWidth = 118;
  int intThumbHeight = 118;
  string sThumbExtension = "thumb_";
  try
  {
 //获取要保存的文件信息
 FileInfo file = new FileInfo(fileNamePath);
 //获得文件扩展名
 string fileNameExt = file.Extension; 

 //验证合法的文件
 if (CheckFileExt(fileNameExt))
 {
   //生成将要保存的随机文件名
   string fileName = GetFileName() + fileNameExt;
   //检查保存的路径 是否有/结尾
   if (sSavePath.EndsWith("/") == false) sSavePath = sSavePath + "/"; 

   //按日期归类保存
   string datePath = DateTime.Now.ToString("yyyyMM") + "/" + DateTime.Now.ToString("dd") + "/";
   if (true)
   {
 sSavePath += datePath;
   }
   //获得要保存的文件路径
   serverFileName = sSavePath + fileName;
   //物理完整路径
   string toFileFullPath = HttpContext.Current.Server.MapPath(sSavePath); 

   //检查是否有该路径 没有就创建
   if (!Directory.Exists(toFileFullPath))
   {
 Directory.CreateDirectory(toFileFullPath);
   } 

   //将要保存的完整文件名
   string toFile = toFileFullPath + fileName; 

   ///创建WebClient实例
   WebClient myWebClient = new WebClient();
   //设定windows网络安全认证
   myWebClient.Credentials = CredentialCache.DefaultCredentials; 

   //要上传的文件
   FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read);
   //FileStream fs = OpenFile();
   BinaryReader r = new BinaryReader(fs);
   //使用UploadFile方法可以用下面的格式
   //myWebClient.UploadFile(toFile, "PUT",fileNamePath);
   byte[] postArray = r.ReadBytes((int)fs.Length);
   Stream postStream = myWebClient.OpenWrite(toFile, "PUT");
   if (postStream.CanWrite)
   {
 postStream.Write(postArray, 0, postArray.Length);
   }
   postStream.Close();
   //以上为原图
   try
   {
 //原图加载
  using (System.Drawing.Image sourceImage = System.Drawing.Image.FromFile(System.Web.HttpContext.Current.Server.MapPath(serverFileName)))
 {
   //原图宽度和高度
   int width = sourceImage.Width;
   int height = sourceImage.Height;
   int smallWidth;
   int smallHeight; 

   //获取第一张绘制图的大小,(比较 原图的宽/缩略图的宽 和 原图的高/缩略图的高)
   if (((decimal)width) / height <= ((decimal)intThumbWidth) / intThumbHeight)
   {
  smallWidth = intThumbWidth;
  smallHeight = intThumbWidth * height / width;
   }
   else
   {
  smallWidth = intThumbHeight * width / height;
  smallHeight = intThumbHeight;
   } 

   //判断缩略图在当前文件夹下是否同名称文件存在
  int file_append = 0;
   sThumbFile = sThumbExtension + System.IO.Path.GetFileNameWithoutExtension(fileName) + fileNameExt; 

   while (System.IO.File.Exists(System.Web.HttpContext.Current.Server.MapPath(sSavePath + sThumbFile)))
   {
  file_append++;
  sThumbFile = sThumbExtension + System.IO.Path.GetFileNameWithoutExtension(fileName) +
file_append.ToString() + fileNameExt;
   }
   //缩略图保存的绝对路径
   string smallImagePath = System.Web.HttpContext.Current.Server.MapPath(sSavePath) + sThumbFile; 

   //新建一个图板,以最小等比例压缩大小绘制原图
   using (System.Drawing.Image bitmap = new System.Drawing.Bitmap(smallWidth, smallHeight))
   {
  //绘制中间图
  using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap))
  {
//高清,平滑
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.Clear(Color.Black);
g.DrawImage(
sourceImage,
new System.Drawing.Rectangle(0, 0, smallWidth, smallHeight),
new System.Drawing.Rectangle(0, 0, width, height),
System.Drawing.GraphicsUnit.Pixel
);
  }
  //新建一个图板,以缩略图大小绘制中间图
  using (System.Drawing.Image bitmap1 = new System.Drawing.Bitmap(intThumbWidth, intThumbHeight))
  {
//绘制缩略图
using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap1))
{
//高清,平滑
  g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
  g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
  g.Clear(Color.Black);
  int lwidth = (smallWidth - intThumbWidth) / 2;
  int bheight = (smallHeight - intThumbHeight) / 2;
  g.DrawImage(bitmap, new Rectangle(0, 0, intThumbWidth, intThumbHeight), lwidth, bheight, intThumbWidth,intThumbHeight, GraphicsUnit.Pixel);
  g.Dispose();
  bitmap1.Save(smallImagePath, System.Drawing.Imaging.ImageFormat.Jpeg);
   return true;
   }
  }
   }
 }
   }
   catch
   {
 //出错则删除
 System.IO.File.Delete(System.Web.HttpContext.Current.Server.MapPath(serverFileName));
 return false;
   } 

 }
 else
 {
   return false;
 }
  }
  catch (Exception e)
  {
 return false;
  }
}
/// <summary>
/// 检查是否为合法的上传文件
/// </summary>
/// <param name="_fileExt"></param>
/// <returns></returns>
private bool CheckFileExt(string _fileExt)
{
  string[] allowExt = new string[] { ".gif", ".jpg", ".jpeg" };
  for (int i = 0; i < allowExt.Length; i++)
  {
 if (allowExt[i] == _fileExt) { return true; }
  }
  return false; 

}
   //生成随机数文件名
public static string GetFileName()
{
  Random rd = new Random();
  StringBuilder serial = new StringBuilder();
  serial.Append(DateTime.Now.ToString("yyyyMMddHHmmssff"));
  serial.Append(rd.Next(0, 999999).ToString());
  return serial.ToString(); 

} 

以上就是小编为大家带来的AJAX实现图片预览与上传及生成缩略图的方法的全部内容了,希望对大家有所帮助,多多支持我们~

(0)

相关推荐

  • swfupload ajax无刷新上传图片实例代码

    最近自己做项目的时候需要添加一个功能,上传用户的图片,上传用户图片其实涉及到很多东西,不只是一个html标签<input id="File1" type="file" />或者asp.net封住好的FileUpload 控件,现在网站不再讲究的是功能性,更多的是用户体验性,在这里上传图片就需要用到ajax无刷新上传图片,这里面包含的东西不是一点半点.这里用到的是一个插件swfupload 实现无刷新上传图片.直接上传我的代码供大家参考. 前台代码区: 复

  • Jquery ajaxsubmit上传图片实现代码

    而且未建立统一上传函数.于是将代码改造了.心想来个ajax异步上传图片吧,这技术应该很老套了.于是直接打开强大的cnblogs轻松的找到了 这篇文章 直接依葫芦画瓢,将该作者的劳动成果直接"拿来主义了".很快就把代码全改造了.可是当我把程序发布到服务器上的时问题来了.上传文件失效了!汗- 都是偷懒造成的恶果.继续打开先前参考的那篇文章.原来作者解释了只能在本地使用而不能发布到服务器上.心想我难道还得用 iframe + http post 这个 郁闷的方式么?? 于是不甘心的我打开了更

  • jQuery AjaxUpload 上传图片代码

    本次使用AJAXUPLOAD做为上传客户端无刷上传插件,其最新版本为3.9,官方地址:http://valums.com/ajax-upload/ 在页面中引入 jquery.min.1.4.2.js 和 ajaxupload.js <script src="Scripts/jquery-1.4.2.min.js" type="text/javascript"></script> <script src="Scripts/aj

  • Ajax上传图片及上传前先预览功能实例代码

    手头上有几个小项目用到了easyUI,一开始决定使用easyUI就注定了项目整体上前后端分离,基本上所有的请求都采用Ajax来完成.在文件上传的时候用到了Ajax上传文件,以及图片在上传之前的预览效果,解决了这两个小问题,和小伙伴们分享下. 上传之前的预览 方式一 先来说说图片上传之前的预览问题.这里主要采用了HTML5中的FileReader对象来实现,关于FileReader对象,如果小伙伴们不了解,可以查看这篇文章HTML5学习之FileReader接口.我们来看看实现方式: <!DOCT

  • jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码

    (jsp需要引入 :jquery-1.9.0.js.jquery.form.js ) ,jsp页面使用的是bootstrap制作的,看不懂的标签不用管,form表单大同小异.代码比较简陋,只是为了演示使用ajaxSubmit异步上传图片及保存数据,请海含! (参考文献:http://www.jb51.net/shouce/jquery/jquery_api/Plugins/Form/ajaxSubmit.html) 一:web (add.jsp) 复制代码 代码如下: <%@page impor

  • 基于HTML5的可预览多图片Ajax上传

    一.关于图片上传什么什么的 在XHTML的时代,我们使用HTML file控件上传图片一次只能上传一张.要一次上传多图,做法是借助于flash.例如swfupload.js.可惜,使用复杂的点,比如flash文件需与页面同父文件夹,JavaScript文件大小也很可观. 我之前曾翻译编辑过一篇"Ajax Upload多文件上传插件"的文章,此插件的亮点是使用隐藏的iframe框架页面模拟ajax上传,但是,实际上,还是一次只能上传1张图片,可以多次上传而已. HTML5是个好东东,其中

  • Ajax 上传图片并预览的简单实现

    1. 直接上最简单的 一种 ajax 异步上传图片,并预览 html: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>图片上传 | cookie</title> </head> <body> file: <

  • 用ajax实现预览链接可以看到链接的内容

    首先先看实现代码 html代码部分 <!DOCTYPE html> <html> <head> <title>Previewing Links</title> <link rel="stylesheet"href="script05.css" rel="external nofollow" > <script src="script05.js">

  • JQuery+ajax实现批量上传图片(自写)

    在网上搜索了一下,发现以jquery+ajax方式实现单张图片上传的代码是有的,但实现批量上传图片的程序却没搜索到,于是根据搜索到的代码,写了一个可以批量上传的.先看效果图 点击增加按钮,会增加一个选择框,如下图: 选择要上传的图片,效果图如下: 上传成功如下图: 下面来看代码:前台html主要代码: 复制代码 代码如下: <button id="SubUpload" class="ManagerButton" onClick="TSubmitUpl

  • AJAX实现图片预览与上传及生成缩略图的方法

    要实现功能,上传图片时可以预览,因还有别的文字,所以并不只上传图片,实现与别的文字一起保存,当然上来先上传图片,然后把路径和别的文字一起写入数据库:同时为 图片生成缩略图,现只写上传图片方法,文字在ajax里直接传参数就可以了,若要上传多图,修改一下就可以了. 借鉴了网上资料,自己写了一下,并不需要再新加页面,只在一个页面里就OK啦. JS代码: //ajax保存数据,后台方法里实现此方法 function SaveData() { filename = document.getElementB

  • vue实现压缩图片预览并上传功能(promise封装)

    本文实例为大家分享了vue实现压缩图片预览并上传的具体代码,供大家参考,具体内容如下 主要用到filereader.canvas 以及 formdata 这三个h5的api 过程大致分为三步: 用户使用input file上传图片的时候,用filereader读取用户上传的图片数据(base64格式) 把图片数据传入img对象,然后将img绘制到canvas上,再调用canvas.toDataURL对图片进行压缩 获取到压缩后的base64格式图片数据,转成二进制塞入formdata,再通过Xm

  • Vue.js 2.0 移动端拍照压缩图片预览及上传实例

    在学习和使用Vue.js 2.0 的过程中遇到不少不一样的地方,本来移动端开发H5应用,准备将mui框架和Vue.js+vue-router+vuex 全家桶结合起来使用,但是在拍照上传的实现过程中遇到了无法调用plus的H5+接口的问题,所以最后拍照上传功能还是使用input file方式里解决的.但是内心还是不甘心的,由于项目进度推进,迭代版本,所以不得不放弃,后续可能我将此功能使用调用H5+接口实现. 首先我来讲我实现这个拍照预览压缩上传的思路,准确的说应该是拍照或选择图片压缩之后预览及上

  • JS实现多张图片预览同步上传功能

    废话不多说了,直接给大家贴代码了,具体代码如下所示: /** * Created by liujing on 2017/5/10. */ $(document).ready(function($) { function changef(which,bulk,name_n){ var bulka = bulk; var thisid = which.attr("id"); var f = which.prop ('files')[0]; var filename = f.name; va

  • Java实战之实现文件资料上传并生成缩略图

    目录 一:需求 二:如何实现需求,以及其中遇到的问题? 需求分析时遇到的问题 编码过程中遇到的问题 三:流程图与UML图 四:上传文件资料生成缩略图 1.上传图片生成缩略图--FastDFS 2.上传视频生成缩略图--javacv 3.上传PDF生成缩略图--pdfbox 4.封装好的方法 五:总结 一:需求 用户有一个需求就是收藏的功能,单纯的收藏记录好做,但是想加点难度就是,生成缩略图.类似B站的收藏一样. 二:如何实现需求,以及其中遇到的问题? 需求分析时遇到的问题 1.如何生成缩略图?

  • c#多图片上传并生成缩略图的实例代码

    前台代码: 复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="upload.aspx.cs" Inherits="upload" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&q

  • 利用ASPUPLOAD,ASPJPEG实现图片上传自动生成缩略图及加上水印

    今天在站长站看到一网友写的相册程序,功能挺简单的,看到他用了ASPJPEG生成缩略图,不由想起再用上ASPUPLOAD上传,于是花了一个小时时间完善了他的代码. 以下代码均加有简单的注释,如果你看不懂,请先看ASPJPEG以及ASPUPLOAD的说明文档(E文,希望有心理准备),看不懂的可以问我. 以下是代码: 复制代码 代码如下: <%  if session("admin")<>"on" then  Response.Redirect"

  • 用js实现预览待上传的本地图片

    <form name="form5" id="form5" method="post" action="#"> <input type="file" name="file5" id="file5" onchange="preview5()"/> </form> <script type="text

  • jquery+php+ajax显示上传进度的多图片上传并生成缩略图代码

    本例用到其他2个php class.upload.php和 functions.php还有css和js以及img文件 完整实例代码点击此处本站下载. 效果图如下: 实现代码如下: JavaScript代码如下: 复制代码 代码如下: <script type="text/javascript">  $(document).ready(function() {      $("#filelist").niceScroll({          cursor

  • input file上传 图片预览功能实例代码

    input file上传图片预览其实很简单,只是没做过的感觉很神奇,今天我就扒下她神秘的面纱,其实原理真的很简单,下面通过一段代码大家都明白了. 具体代码如下所示: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script src="jquery.js"></script>

随机推荐