原文地址: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

  1. <%@page contentType="text/html" pageEncoding="UTF-8"%>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  6. <title>缩略图生成示例</title>
  7. </head>
  8. <body>
  9. <h1>上传图片</h1>
  10. <form name="uploadForm" action="upload.jsp" method="post"
  11. enctype="multipart/form-data">
  12. <input type="text" name="name" />
  13. <input type="file" name="imgPath" />
  14. <input type="submit" value="提交" />
  15. </form>
  16. </body>
  17. </html>

二、编写上传文件代码

upload.jsp

  1. <%@page import="net.coobird.thumbnailator.Thumbnails"%>
  2. <%@page import="org.apache.commons.fileupload.FileItem"%>
  3. <%@page import="java.util.Iterator"%>
  4. <%@page import="java.util.Hashtable"%>
  5. <%@page import="java.util.Map"%>
  6. <%@page import="org.apache.commons.fileupload.FileUploadException"%>
  7. <%@page import="java.util.List"%>
  8. <%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
  9. <%@page import="org.apache.commons.fileupload.FileItemFactory"%>
  10. <%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
  11. <%@page import="java.io.File"%>
  12. <%@page contentType="text/html" pageEncoding="UTF-8"%>
  13. <!DOCTYPE html>
  14. <html>
  15. <head>
  16. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  17. <title>JSP Page</title>
  18. </head>
  19. <body>
  20. <%
  21. request.setCharacterEncoding("UTF-8");
  22. String name = "";
  23. String imgPath = "";
  24. String filePath = "";
  25. if (ServletFileUpload.isMultipartContent(request)) {
  26. try {
  27. FileItemFactory factory = new DiskFileItemFactory();
  28. ServletFileUpload upload = new ServletFileUpload(factory);
  29. upload.setHeaderEncoding("UTF-8");
  30. upload.setFileSizeMax(1024000L);//单个上传文件最大值
  31. upload.setSizeMax(2048000L);//整个请求的大小最大值
  32. List list = upload.parseRequest(request);
  33. Map _fields = new Hashtable();
  34. Iterator it = list.iterator();
  35. String tempPath = request.getRealPath("/temp/");
  36. String UUID = java.util.UUID.randomUUID().toString();
  37. while (it.hasNext()) {
  38. FileItem item = (FileItem) it.next();
  39. if (!item.isFormField()) {
  40. String fileImg = item.getName();
  41. //获取图片后缀
  42. String suffix = fileImg.substring(fileImg.lastIndexOf(".")
  43. , fileImg.length());
  44. filePath = tempPath + File.separator + UUID + suffix;
  45. // 建立目标文件
  46. File file = new File(filePath);
  47. //将文件写入到临时文件上传目录
  48. item.write(file);
  49. _fields.put(item.getFieldName(), UUID + suffix);
  50. } else {
  51. _fields.put(item.getFieldName(), item.getString());
  52. }
  53. }
  54. name = _fields.get("name").toString();
  55. imgPath = _fields.get("imgPath").toString();
  56. String imgPath_s = imgPath.substring(0, imgPath.lastIndexOf("."));
  57. String imgPath_s_suffix = imgPath.substring(imgPath.lastIndexOf(".")
  58. , imgPath.length());
  59. //生成缩略图
  60. String filePath_s_w = tempPath + File.separator + imgPath_s
  61. + "_w" + imgPath_s_suffix;
  62. String filePath_s_h = tempPath + File.separator + imgPath_s
  63. + "_h" + imgPath_s_suffix;
  64. String filePath_s_m = tempPath + File.separator + imgPath_s
  65. + "_m" + imgPath_s_suffix;
  66. //宽为准
  67. Thumbnails.of(filePath)
  68. .size(300, 200)
  69. .toFile(filePath_s_w);
  70. //中图
  71. Thumbnails.of(filePath)
  72. .size(500, 400)
  73. .toFile(filePath_s_m);
  74. //高为准
  75. Thumbnails.of(filePath)
  76. .size(200, 300)
  77. .toFile(filePath_s_h);
  78. } catch (Exception e) {
  79. out.write(e.getMessage());
  80. e.printStackTrace();
  81. }
  82. } else {
  83. name = request.getParameter("name");
  84. imgPath = request.getParameter("imgPath");
  85. }
  86. %>
  87. name:<%=name%><br />
  88. imgPath<%=imgPath%><br />
  89. </body>
  90. </html>

我就代码简单说明一下,我们用ServletFileUpload.isMultipartContent(request)来判断用户的表单是否是以二
进制上传,从而改变获取提交表单数据的模式,因为从二进制里提交的表单,你从request.getParameter中是获取不到值的。

通过commons-fileupload组建,我们很容易的获取到了用户表单上传文件流,并保持到了我们服务器磁盘中。

此示例组要是测试图片生成缩略图,所以就没考虑上传的文件类型,我就当上传的图片类型了,如果上传其他类型的文件,页面会异常,但是文件可以上传的。

好我们来看下生成缩略图的代码,仅仅简单的一行代码。

  1. //size(宽度, 高度)
  2. /*
  3. * 若图片横比200小,高比300小,不变
  4. * 若图片横比200小,高比300大,高缩小到300,图片比例不变
  5. * 若图片横比200大,高比300小,横缩小到200,图片比例不变
  6. * 若图片横比200大,高比300大,图片按比例缩小,横为200或高为300
  7. */
  8. Thumbnails.of("c:/images/1280x1024.jpg")
  9. .size(200, 300)
  10. .toFile("c:/200x300.jpg");

相信代码意思已经不用解释了,关于Thumbnails的其他用法,大家还是去官方网站上查看吧,下载的示例和文档中有详细的说明。

在谷歌开源项目中开源找到地址:

http://code.google.com/p/thumbnailator/downloads/list

如果需要我做的示例的项目源码,留言时写下你的邮箱,我看到会把源码发到你的邮箱。

最后附上项目结构截图:

【转】JSP使用上传文件,并生产高清缩略图示例的更多相关文章

  1. springMVC+jsp+ajax上传文件

    工作中遇到的小问题,做个笔记 实现springMVC + jsp + ajax 上传文件 HTML <body> <form id="myform" method ...

  2. ThinkPHP 5 文件上传及指定宽高生成缩略图公共方法

    这个是非常常用的案例,ThinkPHP 5 文件上传及指定宽高生成缩略图公共方法/** * 单文件上传 * name:表单上传文件的名字 * ext: 文件允许的后缀,字符串形式 * path:文件保 ...

  3. JSP && Servlet | 上传文件

    在WebContent下新建index.jsp 要点: 1.  表单 method 属性应该设置为 POST 方法,不能使用 GET 方法. 2.  表单 enctype 属性应该设置为 multip ...

  4. 黄聪:CamtasiaStudio如何导出视频上传优酷实现高清

  5. spring mvc(注解)上传文件的简单例子

    spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...

  6. springMVC 上传文件

    spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...

  7. SpringMvc(注解)上传文件的简单例子

    spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...

  8. from 表单上传文件和下载?

    from表单上传单个文件的方法. 分为三个部分,简单演示. 一部分 表单上传文件 <%-- Created by IntelliJ IDEA. User: Administrator Date: ...

  9. golang 上传文件(包括 gin 实现)

    golang web服务有时候需要提供上传文件的接口,以下就是具体示例.为了示例简单(吐槽下 golang 的错误处理), 忽略了所有的错误处理.本文会用两种方式(标准库和gin)详细讲解 golan ...

随机推荐

  1. kali开启ssh

    Kali 2.0安装之后需要做的事--使用SSH进行远程登录   2015年8月11日,Kali官方推出了新的kali系统2.0版本,此次升级最大的特点就是系统界面的设计理念更加先进,以及系统的升级方 ...

  2. iOS中NSScanner 的用法

    NSScanner是一个类,用于在字符串中扫描指定的字符,尤其是把它们翻译/转换为数字和别的字符串.可以创建NSScanner时制定他的String属性,然后scanner会按照你的要求从头到尾扫描这 ...

  3. BZOJ4197[NOI2005]寿司晚宴

    Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同 ...

  4. 用Docker封装一个web应用(Django)

    一.复用以前一个封装了SSH的镜像,如果没有封装SSH,可以使用自己的镜像或参考我以前博文:叫板OpenStack:用Docker实现私有云 的前五步 接下来便是正题. 二.部署过程 1.查看镜像 R ...

  5. MYSQL游标使用

    CREATE PROCEDURE `sp_UpdateData`() BEGIN ); /*修改会员卡的几个金额*/ DECLARE done INT DEFAULT FALSE; DECLARE c ...

  6. Tomcat6配置webdav协议

    Tomcat6默认是支持webdav协议的,只是webapps目录中不带例子而已.要添加支持很简单,在webapps目录中建立webdav目录,在webdav目录中建立WEB-INF目录,加入web. ...

  7. zabbix_proxy安装[yum mysql5.6]

      安装mysql rpm -ivh http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm   修改mysql配置: [m ...

  8. jboss:在standalone.xml中设置系统属性(system-properties)

    就象在.net的web应用中,可以在web.config中设置appSettings一样,jboss的standalone.xml中也可以由开发人员自行添加系统属性,用法如下: </extens ...

  9. 工作随笔——Java调用Groovy类的方法、传递参数和获取返回值

    接触Groovy也快一年了,一直在尝试怎么将Groovy引用到日常工作中来.最近在做一个功能的时候,花了点时间重新看了下Java怎么调用Groovy的方法.传递参数和获取返回值. 示例Groovy代码 ...

  10. PRML读书会第十二章 Continuous Latent Variables(PCA,Principal Component Analysis,PPCA,核PCA,Autoencoder,非线性流形)

    主讲人 戴玮 (新浪微博: @戴玮_CASIA) Wilbur_中博(1954123) 20:00:49 我今天讲PRML的第十二章,连续隐变量.既然有连续隐变量,一定也有离散隐变量,那么离散隐变量是 ...