1 文件上传
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>文件上传页面</title> </head> <body> <form action="<%=request.getContextPath()%>/userHeadImg/uploadHead.anys" method="post" enctype="multipart/form-data"> yourfile: <input type="file" name="myfile"/><br/> <input type="submit" value="上传"/> </form> </body> </html>
2 文件裁切页面
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>文件裁切页面</title> <script src="http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js" type="text/ecmascript"></script> <script type="text/javascript" src="<%=request.getContextPath() %>/script/jquery-1.7.2.min.js"></script> <script type="text/javascript" src="<%=request.getContextPath() %>/script/jscrop/js/jquery.color.js"></script> <script type="text/javascript" src="<%=request.getContextPath() %>/script/jscrop/js/jquery.Jcrop.js"></script> <link rel="stylesheet" href="<%=request.getContextPath() %>/script/jscrop/css/jquery.Jcrop.css" type="text/css" /> </head> <body>111111 <form action="<%=request.getContextPath()%>/userHeadImg/cutPic.anys" method="post"> <input type="text" name="srcpath" value="${ fileName}"/> <input type="text" name="x" id="x"/> <input type="text" name="y" id="y"/> <input type="text" name="width" id="width"/> <input type="text" name="height" id="height"/> <input type="submit" value="确定" /> </form> <hr /> <img src="<%=request.getContextPath()%>${ path}" alt="" id="target"/> 预览: <div style="width:105px;height:105px;overflow:hidden; border:1px solid gray;"> <img id="preview1" width="105px" height="105px" src="<%=request.getContextPath()%>${ path}" /> </div> <div style="width:50px;height:50px;overflow:hidden; border:1px solid gray;"> <img id="preview2" width="50px" height="50px" src="<%=request.getContextPath()%>${ path}" /> </div> <div style="width:30px;height:30px;overflow:hidden; border:1px solid gray;"> <img id="preview3" width="30px" height="30px" src="<%=request.getContextPath()%>${ path}" /> </div> </body> <script type="text/javascript"> var x; var y; var width; var height; $(function(){ var jcrop_api, boundx, boundy; //使原图具有裁剪功能 $('#target').Jcrop({ onChange: updatePreview, onSelect: updatePreview, aspectRatio: 1 },function(){ // Use the API to get the real image size var bounds = this.getBounds(); boundx = bounds[0]; boundy = bounds[1]; // Store the API in the jcrop_api variable jcrop_api = this; }); //裁剪过程中,每改变裁剪大小执行该函数 function updatePreview(c){ if (parseInt(c.w) > 0){ $('#preview1').css({ width: Math.round(105/ c.w * boundx) + 'px', //200 为预览div的宽和高</span> height: Math.round(105 / c.h * boundy) + 'px', marginLeft: '-' + Math.round(105 / c.w * c.x) + 'px', marginTop: '-' + Math.round(105 / c.h * c.y) + 'px' }); $('#preview2').css({ width: Math.round(50/ c.w * boundx) + 'px', //200 为预览div的宽和高</span> height: Math.round(50 / c.h * boundy) + 'px', marginLeft: '-' + Math.round(50 / c.w * c.x) + 'px', marginTop: '-' + Math.round(50 / c.h * c.y) + 'px' }); $('#preview3').css({ width: Math.round(30/ c.w * boundx) + 'px', //200 为预览div的宽和高</span> height: Math.round(30 / c.h * boundy) + 'px', marginLeft: '-' + Math.round(30 / c.w * c.x) + 'px', marginTop: '-' + Math.round(30 / c.h * c.y) + 'px' }); $('#width').val(c.w); //c.w 裁剪区域的宽 $('#height').val(c.h); //c.h 裁剪区域的高 $('#x').val(c.x); //c.x 裁剪区域左上角顶点相对于图片左上角顶点的x坐标 $('#y').val(c.y); //c.y 裁剪区域顶点的y坐标</span> } }; }); </script> </html>
3 文件处理控制器
package com.mainbo.master.controller; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.ModelAndView; import com.mainbo.master.util.OperateImage; import com.mainbo.u3.util.FileUtil; @Controller @RequestMapping("/userHeadImg") public class UserHeadImgController { // 日志 public Logger logger = Logger.getLogger(UserHeadImgController.class); @RequestMapping(value = "/uploadHead.anys", method = RequestMethod.POST) public ModelAndView uploadHeadImg(@RequestParam MultipartFile myfile, ModelAndView model, HttpServletRequest request) throws IOException { // 如果只是上传一个文件,则只需要MultipartFile类型接收文件即可,而且无需显式指定@RequestParam注解 // 如果想上传多个文件,那么这里就要用MultipartFile[]类型来接收文件,并且还要指定@RequestParam注解 // 并且上传多个文件时,前台表单中的所有<input // type="file"/>的name都应该是myfiles,否则参数里的myfiles无法获取到所有上传的文件 String fileName = null; if (myfile.isEmpty()) { System.out.println("文件未上传"); } else { System.out.println("文件长度: " + myfile.getSize()); System.out.println("文件类型: " + myfile.getContentType()); System.out.println("文件名称: " + myfile.getName()); System.out.println("文件原名: " + myfile.getOriginalFilename()); fileName = saveFile(myfile, request, getSuffix(myfile.getContentType())); } model.getModel().put("fileName", fileName); model.getModel().put("path", FileUtil.getUserHeadImgDir(2,request)+"/"+fileName); // model.getModel().put("preview", "/upload/finish/2.png"); model.setViewName("/fileUploadTest/fileuploadTest1"); return model; } @RequestMapping(value = "/cutPic.anys", method = RequestMethod.POST) public ModelAndView cutPic(@ModelAttribute OperateImage image, ModelAndView model, HttpServletRequest request) throws IOException { String fileName = image.getSrcpath(); image.setSrcpath(FileUtil.getUserHeadImgDir(1 , request ) +"/"+ image.getSrcpath());//拼接文件路径 // 图片剪切后 的文件路径 image.setSubpath(FileUtil.getUserHeadImgDir(1,request)+"/"+fileName); image.cut(FileUtil.getFileSuffix( fileName ) ); // 执行裁剪操作 执行完后即可生成目标图在对应文件夹内。 //文件存放数据库 model.getModel().put("fileName", fileName); model.getModel().put("path", FileUtil.getUserHeadImgDir(2,request)+"/"+fileName); //model.getModel().put("preview", "/upload/finish/2.png"); model.setViewName("/fileUploadTest/fileuploadTest1"); return model; } /** * @param myfile * @param request * @param suffix * @return */ private String saveFile(MultipartFile myfile, HttpServletRequest request, String suffix) { BufferedOutputStream bos = null; BufferedInputStream bis = null; // 如果用的是Tomcat服务器,则文件会上传到\\%TOMCAT_HOME%\\webapps\\YourWebProject\\WEB-INF\\upload\\文件夹中 String realPath = FileUtil.getUserHeadImgDir(1 , request); // 这里不必处理IO流关闭的问题,因为FileUtils.copyInputStreamToFile()方法内部会自动把用到的IO流关掉,我是看它的源码才知道的 // FileUtils.copyInputStreamToFile(myfile.getInputStream(), new // File(realPath, myfile.getOriginalFilename())); String newFileName = FileUtil.getRandomFileName(myfile.getName(),suffix); File saveFile = new File(new File(realPath), newFileName); // 在该实际路径下实例化一个文件 // 判断父目录是否存在 if (!saveFile.getParentFile().exists()) { saveFile.getParentFile().mkdirs(); } try { bis = new BufferedInputStream(myfile.getInputStream()); bos = new BufferedOutputStream(new FileOutputStream(saveFile)); byte[] bs = new byte[1024]; int len; while ((len = bis.read(bs, 0, 1024)) > 0) { bos.write(bs, 0, len); } bis.close(); bos.close(); return newFileName; } catch (Exception e) { e.printStackTrace(); } finally { try { if (bis != null) { bis.close(); } if (bos != null) { bos.close(); } } catch (IOException e) { e.printStackTrace(); } } return null; } private String getSuffix(String contentType) { return contentType.substring(contentType.lastIndexOf("/") + 1); } }
4 文件裁切工具类
package com.mainbo.master.util; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Iterator; import javax.imageio.ImageIO; import javax.imageio.ImageReadParam; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; //图片剪切的工具类 public class OperateImage { // ===源图片路径名称如:c:\1.jpg private String srcpath; // ===剪切图片存放路径名称.如:c:\2.jpg private String subpath; // ===剪切点x坐标 private int x; private int y; // ===剪切点宽度 private int width; private int height; private String type="jpg"; //jpg 或者 png 小写 public OperateImage() { } /** 对图片裁剪,并把裁剪完的新图片保存 */ public void cut(String type) throws IOException { setType(type); FileInputStream is = null; ImageInputStream iis = null; try { // 读取图片文件 is = new FileInputStream(srcpath); /* * 返回包含所有当前已注册 ImageReader 的 Iterator,这些 ImageReader 声称能够解码指定格式。 * 参数:formatName - 包含非正式格式名称 . (例如 "jpeg" 或 "tiff")等 。 */ Iterator<ImageReader> it = ImageIO.getImageReadersByFormatName(type); ImageReader reader = it.next(); // 获取图片流 iis = ImageIO.createImageInputStream(is); /* * <p>iis:读取源.true:只向前搜索 </p>.将它标记为 ‘只向前搜索’。 * 此设置意味着包含在输入源中的图像将只按顺序读取,可能允许 reader 避免缓存包含与以前已经读取的图像关联的数据的那些输入部分。 */ reader.setInput(iis, true); /* * <p>描述如何对流进行解码的类<p>.用于指定如何在输入时从 Java Image I/O * 框架的上下文中的流转换一幅图像或一组图像。用于特定图像格式的插件 将从其 ImageReader 实现的 * getDefaultReadParam 方法中返回 ImageReadParam 的实例。 */ ImageReadParam param = reader.getDefaultReadParam(); /* * 图片裁剪区域。Rectangle 指定了坐标空间中的一个区域,通过 Rectangle 对象 * 的左上顶点的坐标(x,y)、宽度和高度可以定义这个区域。 */ Rectangle rect = new Rectangle(x, y, width, height); // 提供一个 BufferedImage,将其用作解码像素数据的目标。 param.setSourceRegion(rect); /* * 使用所提供的 ImageReadParam 读取通过索引 imageIndex 指定的对象,并将 它作为一个完整的 * BufferedImage 返回。 */ BufferedImage bi = reader.read(0, param); // 保存新图片 ImageIO.write(bi, type, new File(subpath)); } finally { if (is != null) is.close(); if (iis != null) iis.close(); } } public String getSrcpath() { return srcpath; } public void setSrcpath(String srcpath) { this.srcpath = srcpath; } public String getSubpath() { return subpath; } public void setSubpath(String subpath) { this.subpath = subpath; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public int getWidth() { return width; } public void setWidth(int width) { this.width = width; } public int getHeight() { return height; } public void setHeight(int height) { this.height = height; } public String getType() { return type; } public void setType(String type) { if( type==null || "".equals( type)){ this.type = "jpg"; return ; } if("png".equals(type)){ this.type = "png"; }else{ this.type = "jpg"; } } //------------以下是工具类 //得到文件的后缀 public static String getFileSuffix(String fileName){ if( fileName==null || "".equals(fileName)){ return null; } return fileName.substring(fileName.indexOf(".")+1); } //得到文件的名称根据文件路径 public static String getFileName(String filePath){ if( filePath==null || "".equals(filePath)){ return null; } return filePath.substring(filePath.indexOf(File.separator)+1); } }
5 文件工具类
/** * */ package com.mainbo.u3.util; import java.io.File; import java.util.Random; import javax.servlet.http.HttpServletRequest; public class FileUtil { /** * 得到随机的文件名称 * @param fileName 无后缀名称 * @param suffix 文件后缀 * @return */ public static String getRandomFileName(String fileName,String suffix ) { Random rm = new Random(); String newFileName = System.currentTimeMillis() + rm.nextInt(1000) + fileName+ "." + suffix; return newFileName; } /** * 得到随机的文件名称 * @param filePath 文件路径或带有后缀的文件名称 * @return */ public static String getRandomFileName(String filePath) { if(filePath==null || "".equals(filePath)){ return ""; } String fileName = filePath; if(fileName.indexOf( File.separator)!=-1){ fileName = fileName.substring(fileName.lastIndexOf( File.separator)+1); } String suffix = fileName.substring(fileName.lastIndexOf( ".")+1); String fileNameNoSuffix = fileName.substring(0,fileName.lastIndexOf( ".")); Random rm = new Random(); String newFileName = System.currentTimeMillis() + rm.nextInt(1000) + fileNameNoSuffix+ "." + suffix; return newFileName; } /** * 得到文件的后缀名称 * @param fileName * @param suffix * @return */ public static String getFileSuffix(String fileName ) { if(fileName==null || "".equals(fileName)){ return ""; } return fileName.substring( fileName.lastIndexOf(".")+1 ).toLowerCase(); } /** * @param type 1 大图 2 剪切后的小图 路径 * 1 和2 文件保存使用路径 * 3 和4 页面显示的时候拼接的路径 * @param req * @return */ public static String getUserHeadImgDir(Integer type,HttpServletRequest request ) { if(type==1){ return request.getServletContext().getRealPath("/")+"/uploadfile/uploadbig"; }else{ return "/uploadfile/uploadbig"; } } /** * @author Junming Wang * @param args */ public static void main(String[] args) { File file = new File(""); } }
相关推荐
《PHP图片裁切工具详解与应用》 在Web开发领域,图片处理是一项常见的任务,而PHP作为广泛应用的服务器端脚本语言,拥有丰富的图像处理库和工具,使得开发者能够轻松地进行图片裁剪、缩放、旋转等操作。本文将详细...
《图片在线裁切工具ZoomImageDemo详解》 在数字化时代,图片处理技术变得越来越重要,尤其是在网络应用中,用户往往需要对图片进行裁剪、调整大小等操作以满足不同的需求。今天我们将深入探讨一个名为...
本教程将深入探讨图片自由裁切的原理、工具以及实际操作技巧。 一、图片裁切的必要性 1. 适应不同展示平台:不同的社交媒体、网站或打印项目可能对图片尺寸有特定要求,自由裁切可以将图片调整到合适的大小。 2. ...
《图片缩放裁切工具V2.0:高效编辑与灵活调整》 在数字图像处理领域,图片的缩放和裁切是常见的基本操作。图片缩放裁切工具V2.0为此提供了专业的解决方案,旨在帮助用户高效地调整图像尺寸,优化图像比例,满足不同...
Vue3+TS图片裁切组件,在main.ts中全局引入 import ImageCrop from "@/components/image-crop/" const app = createApp(App) app.use(ImageCrop); app.mount('#app ') 在对应的页面使用 裁切比例,不用此参数自由...
"TOCropViewController"是由Tim Oliver开发的一个Swift项目,它是一个精心设计的iOS图片裁切工具库,旨在为用户提供直观且美观的图像裁剪体验。这个库的核心是一个视图控制器,该控制器能够接收UIImage对象,并让...
用ASP+ImageMagik组件制作的在线照片编辑工具程序利用Js进行图片 放大,缩小,裁切工具,后台采用注明ImageMagik组件处理图片。工具使用范围:方便制作论坛头像,在没有图片处'用ASP+ImageMagik组件制作的在线照片...
"jQuery图片裁切+PHP文件上传"方案就是解决此类问题的一个高效工具,它允许用户在前端预览并裁剪图片,然后通过PHP后端进行安全、稳定的文件上传。本文将深入探讨这一技术的实现原理和步骤。 一、jQuery图片裁切 ...
【标题】"jsp图片裁切源码(仿开心网)" 涉及的主要知识点是基于JSP的图像处理技术,特别是图片裁剪功能的实现。这个项目模仿了开心网的图片裁剪功能,旨在为用户提供一个用户友好的图片裁剪界面和后端处理逻辑。 ...
《空间数据批量裁切工具详解》 在地理信息系统(GIS)领域,空间数据的管理和处理是核心任务之一。"空间数据批量裁切工具"是一种高效实用的软件工具,专为处理大量的地理空间数据而设计。它能够帮助用户快速地裁剪...
《C#实现的图片快速批量裁切工具:高效构建数据集》 在计算机视觉和机器学习领域,构建高质量的数据集是至关重要的一步。这通常涉及到大量图片的处理,包括裁剪、旋转、缩放等操作。为了提高工作效率,开发者们会...
ajax+js+asp+aspjpeg实现剪切图片、拖拽图片、缩放图片、裁切图片 主要功能: 加载服务器上的图片,用户可以自定义图片的大小,拖拽,缩放,裁切,预览等效果! 可以作为自定义头像功能使用! 备注:在这里我要向...
### 图片裁切工具 项目中可能包含一个基于jQuery和PHP的图片裁切插件,这类插件通常提供以下功能: 1. **拖动选择**:用户可以通过鼠标拖动选择要裁剪的区域。 2. **比例控制**:设置固定的宽高比,确保裁剪出的...
在VB6.0中实现图片裁切功能是一个常见的图像处理任务,这主要涉及到对图形界面的设计、图片的读取以及图像处理算法的应用。本代码实例提供了详细的解决方案,支持单图和批量图片的裁剪,无论是纵向还是横向都能轻松...
1. **初始化插件**:在HTML结构中,我们需要为需要居中裁切的图片元素添加特定的类名,然后在页面加载完成后调用VMiddleImg插件进行初始化。 2. **计算比例**:插件会获取图片的真实宽度和高度,以及其容器的宽度。...
首先,我们需要在HTML页面上创建一个表单,用于用户选择和提交图片。这个表单通常包含一个`<input type="file">`元素,让用户选择本地的图片文件。例如: ```html *"> 上传 ``` 接着,我们需要使用jQuery监听...
批量图片裁切和转换格式软件就是为了满足这种需求而设计的工具,它们能够极大地提高工作效率,节省时间。本文将深入探讨这类软件的工作原理、功能以及实际应用。 首先,批量图片裁切是指一次性处理多张图片,根据...
《jQuery图片裁切预览与简单拖动技术详解》 在网页开发中,图片的裁切和预览功能是常见的需求,特别是在用户上传照片时,需要提供一种方式让用户自行调整图片大小和位置,以达到理想的展示效果。jQuery库以其丰富的...