【转】JSP使用上传文件,并生产高清缩略图示例
原文地址:http://blog.csdn.net/yakson/article/details/9875731
前言
刚开始本来只想来测试一下Thumbnails生成缩略图的效果的,顺便来学一下jsp文件,开始没有使用commons-fileupload上 传组件,自己用纯jsp代码来编写,过程相当曲折。所以就不建议大家去编写纯JSP的上传代码了,想写的可以参考下commons-fileupload 的源码,里面很详细。
一、JSP上传文件
大家都知道,上传文件是以二进制上传的,这样可以让文件上传,所以JSP要做到将文件以二进制上传,我们再HTML的表单提交时就要设置enctype="multipart/form-data",这个大家应该都很清楚了。
首先我先将jar包引用列出来,大家先找好这几个jar文件,引入项目
commons-fileupload-1.2.2.jar
commons-io-2.0.1.jar
thumbnailator-0.4.2.jar
先上一下上传页面的JSP代码,其实很简单,放一个file文件选择框就可以,我为了测试,顺便加了一个文本框。
index.jsp
- <%@page contentType="text/html" pageEncoding="UTF-8"%>
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>缩略图生成示例</title>
- </head>
- <body>
- <h1>上传图片</h1>
- <form name="uploadForm" action="upload.jsp" method="post"
- enctype="multipart/form-data">
- <input type="text" name="name" />
- <input type="file" name="imgPath" />
- <input type="submit" value="提交" />
- </form>
- </body>
- </html>
二、编写上传文件代码
upload.jsp
- <%@page import="net.coobird.thumbnailator.Thumbnails"%>
- <%@page import="org.apache.commons.fileupload.FileItem"%>
- <%@page import="java.util.Iterator"%>
- <%@page import="java.util.Hashtable"%>
- <%@page import="java.util.Map"%>
- <%@page import="org.apache.commons.fileupload.FileUploadException"%>
- <%@page import="java.util.List"%>
- <%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
- <%@page import="org.apache.commons.fileupload.FileItemFactory"%>
- <%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
- <%@page import="java.io.File"%>
- <%@page contentType="text/html" pageEncoding="UTF-8"%>
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>JSP Page</title>
- </head>
- <body>
- <%
- request.setCharacterEncoding("UTF-8");
- String name = "";
- String imgPath = "";
- String filePath = "";
- if (ServletFileUpload.isMultipartContent(request)) {
- try {
- FileItemFactory factory = new DiskFileItemFactory();
- ServletFileUpload upload = new ServletFileUpload(factory);
- upload.setHeaderEncoding("UTF-8");
- upload.setFileSizeMax(1024000L);//单个上传文件最大值
- upload.setSizeMax(2048000L);//整个请求的大小最大值
- List list = upload.parseRequest(request);
- Map _fields = new Hashtable();
- Iterator it = list.iterator();
- String tempPath = request.getRealPath("/temp/");
- String UUID = java.util.UUID.randomUUID().toString();
- while (it.hasNext()) {
- FileItem item = (FileItem) it.next();
- if (!item.isFormField()) {
- String fileImg = item.getName();
- //获取图片后缀
- String suffix = fileImg.substring(fileImg.lastIndexOf(".")
- , fileImg.length());
- filePath = tempPath + File.separator + UUID + suffix;
- // 建立目标文件
- File file = new File(filePath);
- //将文件写入到临时文件上传目录
- item.write(file);
- _fields.put(item.getFieldName(), UUID + suffix);
- } else {
- _fields.put(item.getFieldName(), item.getString());
- }
- }
- name = _fields.get("name").toString();
- imgPath = _fields.get("imgPath").toString();
- String imgPath_s = imgPath.substring(0, imgPath.lastIndexOf("."));
- String imgPath_s_suffix = imgPath.substring(imgPath.lastIndexOf(".")
- , imgPath.length());
- //生成缩略图
- String filePath_s_w = tempPath + File.separator + imgPath_s
- + "_w" + imgPath_s_suffix;
- String filePath_s_h = tempPath + File.separator + imgPath_s
- + "_h" + imgPath_s_suffix;
- String filePath_s_m = tempPath + File.separator + imgPath_s
- + "_m" + imgPath_s_suffix;
- //宽为准
- Thumbnails.of(filePath)
- .size(300, 200)
- .toFile(filePath_s_w);
- //中图
- Thumbnails.of(filePath)
- .size(500, 400)
- .toFile(filePath_s_m);
- //高为准
- Thumbnails.of(filePath)
- .size(200, 300)
- .toFile(filePath_s_h);
- } catch (Exception e) {
- out.write(e.getMessage());
- e.printStackTrace();
- }
- } else {
- name = request.getParameter("name");
- imgPath = request.getParameter("imgPath");
- }
- %>
- name:<%=name%><br />
- imgPath<%=imgPath%><br />
- </body>
- </html>
我就代码简单说明一下,我们用ServletFileUpload.isMultipartContent(request)来判断用户的表单是否是以二
进制上传,从而改变获取提交表单数据的模式,因为从二进制里提交的表单,你从request.getParameter中是获取不到值的。
通过commons-fileupload组建,我们很容易的获取到了用户表单上传文件流,并保持到了我们服务器磁盘中。
此示例组要是测试图片生成缩略图,所以就没考虑上传的文件类型,我就当上传的图片类型了,如果上传其他类型的文件,页面会异常,但是文件可以上传的。
好我们来看下生成缩略图的代码,仅仅简单的一行代码。
- //size(宽度, 高度)
- /*
- * 若图片横比200小,高比300小,不变
- * 若图片横比200小,高比300大,高缩小到300,图片比例不变
- * 若图片横比200大,高比300小,横缩小到200,图片比例不变
- * 若图片横比200大,高比300大,图片按比例缩小,横为200或高为300
- */
- Thumbnails.of("c:/images/1280x1024.jpg")
- .size(200, 300)
- .toFile("c:/200x300.jpg");
相信代码意思已经不用解释了,关于Thumbnails的其他用法,大家还是去官方网站上查看吧,下载的示例和文档中有详细的说明。
在谷歌开源项目中开源找到地址:
http://code.google.com/p/thumbnailator/downloads/list
如果需要我做的示例的项目源码,留言时写下你的邮箱,我看到会把源码发到你的邮箱。
最后附上项目结构截图:
【转】JSP使用上传文件,并生产高清缩略图示例的更多相关文章
- springMVC+jsp+ajax上传文件
工作中遇到的小问题,做个笔记 实现springMVC + jsp + ajax 上传文件 HTML <body> <form id="myform" method ...
- ThinkPHP 5 文件上传及指定宽高生成缩略图公共方法
这个是非常常用的案例,ThinkPHP 5 文件上传及指定宽高生成缩略图公共方法/** * 单文件上传 * name:表单上传文件的名字 * ext: 文件允许的后缀,字符串形式 * path:文件保 ...
- JSP && Servlet | 上传文件
在WebContent下新建index.jsp 要点: 1. 表单 method 属性应该设置为 POST 方法,不能使用 GET 方法. 2. 表单 enctype 属性应该设置为 multip ...
- 黄聪:CamtasiaStudio如何导出视频上传优酷实现高清
- spring mvc(注解)上传文件的简单例子
spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...
- springMVC 上传文件
spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...
- SpringMvc(注解)上传文件的简单例子
spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...
- from 表单上传文件和下载?
from表单上传单个文件的方法. 分为三个部分,简单演示. 一部分 表单上传文件 <%-- Created by IntelliJ IDEA. User: Administrator Date: ...
- golang 上传文件(包括 gin 实现)
golang web服务有时候需要提供上传文件的接口,以下就是具体示例.为了示例简单(吐槽下 golang 的错误处理), 忽略了所有的错误处理.本文会用两种方式(标准库和gin)详细讲解 golan ...
随机推荐
- Openxml入门---Openxm读取Excel数据
Openxml读取Excel数据: 有些问题,如果当Cell 里面是 日期和浮点型的话,对应的Cell.DataType==Null,对应的时间会转换为一个浮点型,对于这块可以通过DateTime.F ...
- Spring学习之第一个AOP程序
IOC和AOP是Spring的两大基石,AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP). 在进行 OOP 开发时,都是基于对 ...
- file_get_contents模仿浏览器头(user_agent)获取数据
本篇文章是对file_get_contents模仿浏览器头(user_agent)获取数据进行了详细的分析介绍,需要的朋友参考下 什么是user agentUser Agent中文名为用户代理 ...
- 利用注解进行sql反射代码示例
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Table { String val ...
- ComboBox的数据联动
实现效果: 点击年级下拉框值时,获取科目下拉框值 一:加载年级下拉框值 GradeDAL层: //检索所有年级名称集合,返回的是泛型集合List<Grade> public List< ...
- SilverFoxServer出炉!!
SilverFoxServer是啥?各位看官搜一下SmartFoxServer便知 是一套服务端+客户端通迅框架,快速搭建起回合制,棋牌类的联机 网页游戏 SilverFoxServer的特点包括 用 ...
- java 24 - 5 GUI之 鼠标移动改变窗体背景颜色
需求: 创建一个可改变背景颜色的窗口,鼠标移动到按钮上,窗口背景就会改变成特定的颜色 步骤: (大致上) 创建窗口对象 创建按钮对象 添加按钮到窗口中 设置窗口关闭监听事件 设置鼠标进入按钮区域的监听 ...
- ES5特性之Object.freeze
Object.freeze方法比Object.seal方法更严格,不仅不能扩展新对象和不可重新配置属性的特性,还不能改变对象属性的值writable(不可写)
- linux系统root密码遗忘的情况下的解决办法
机房一台centos系统的服务器,由于这台服务器的系统装了好长时间,且root密码中间更新过几次,后面去机房现场维护时,登陆密码遗忘了,悲催啊~ 没办法,只能开机进入“单用户模式”进行密码重置了. 下 ...
- Iterator遍历器 调用Symbol.Iterator属性,遍历器对象。
Iterator实现原理 创建一个指针对象,指向当前数据结构的起始位置.也就是说,遍历器对象本质上,就是一个指针对象. 第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员. 第二次调 ...