侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

前端  /  管理员 发布于 5年前   389

要实现功能,上传图片时可以预览,因还有别的文字,所以并不只上传图片,实现与别的文字一起保存,当然上来先上传图片,然后把路径和别的文字一起写入数据库;同时为 图片生成缩略图,现只写上传图片方法,文字在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="//article/" 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实现图片预览与上传及生成缩略图的方法的全部内容了,希望对大家有所帮助,多多支持~


  • 上一条:
    基于ajax html实现文件上传技巧总结
    下一条:
    Ajax 上传图片并预览的简单实现
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 使用 Alpine.js 排序插件对元素进行排序(0个评论)
    • 在js中使用jszip + file-saver实现批量下载OSS文件功能示例(0个评论)
    • 在vue中实现父页面按钮显示子组件中的el-dialog效果(0个评论)
    • 使用mock-server实现模拟接口对接流程步骤(0个评论)
    • vue项目打包程序实现把项目打包成一个exe可执行程序(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-03
    • 2018-04
    • 2018-05
    • 2018-06
    • 2018-09
    • 2018-11
    • 2018-12
    • 2019-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-04
    • 2021-05
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客