web开发中将上传图片压缩后以image类型存入数据库(转)
2009-03-11 17:45
转自http://blog.sina.com.cn/s/blog_4ce383f30100chmm.html
不久前,本人在一个小型java web项目开发中需要上传一个图片的同时,将其进行适当压缩,然后直接以image类型存入SQL Server数据库。之前,本人在网络上查找了好长时间,都没有找到合适的源码,要么就是存原图片,要么就是把图片压缩后存到服务器上,然后把相对路径以string类型存入数据库或以image类型存入数据库,本例与其不同的是,要求图片在内存中压缩后直接以image类型存入数据库。具体实现如下:
①首先,新建一个upload.jsp文件,用来选择需要上传的图片,源码如下:
<%@ page contentType="text/html; charset=gb2312" language="java"
import="java.sql.*" errorPage=""%>
<html >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>上传并压缩图片</title>
<style>
td {
font-family: "宋体";
font-size: 12px;
}
</style>
</head>
<body>
<table border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td height="45" align="center" valign="middle">
<form action="ImgDealServlet" method="post"
enctype="multipart/form-data" name="form1">
<table border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td colspan="2" height="50">
<div align="center">
上传并压缩图片应用
</div>
</td>
</tr>
<tr>
<td>
请选择上传的图片
</td>
<td>
<input type="file" name="file" />
<input type="submit" name="Submit" value="上传" />
</td>
</tr>
</table>
</form>
</td>
</tr>
</table>
</body>
</html>
②然后,创建一个servlet文件ImgDealServlet.java,用来处理图片的上传,源码如下:
package servlet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.sql.ResultSet;
import util.*;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.jspsmart.upload.SmartUpload;
public class ImgDealServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("GB2312");
response.setContentType("text/html; charset=GB2312");
PrintWriter out = response.getWriter();
SmartUpload mySmartUpload = new SmartUpload();
mySmartUpload.initialize(getServletConfig(),request,response);
try {
mySmartUpload.setAllowedFilesList("jpg,JPG,gif");
//上载文件
mySmartUpload.upload();
} catch (Exception e) {
out.print("<SCRIPT language='javascript'>");
out.print("alert('只允许上传.jpg和.gif类型图片文件');");
out.print("window.location='upfile.jsp';");
out.print("</SCRIPT>");
}
try {
com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(0);
// 若文件不存在
if (myFile.isMissing()) {
out.print("<SCRIPT language='javascript'>");
out.print("alert('请先选择要上传的文件');");
out.print("window.location='upfile.jsp';");
out.print("</SCRIPT>");
}
else {
String myFilePath=myFile.getFilePathName(); //取得上载的文件的路径
UploadImg ui=new UploadImg();
BufferedImage tag =ui.getResizeImg(myFilePath,400,300,true);
if(tag!=null){
ui.saveImgToDB(tag);
}
response.sendRedirect("showimg.jsp");
}
} catch (Exception e) {
e.toString();
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
}
③之前的servlet文件中用到了一个自定义包中的类UploadImg.java,其中定义了图片处理的方法,其源码如下:
package util;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import javax.imageio.ImageIO;
import util.DBConnect;
public class UploadImg {
String myFilePath = "";
public BufferedImage getResizeImg(String path, int width, int height,
boolean isResize) {
String myFilePath = path; // 取得上载的文件的路径
BufferedImage srcimg, tag;
tag = null;
int new_w; // 压缩后大小
int new_h;
boolean Resize;// 是否等比缩放
try {
srcimg = ImageIO.read(new java.io.File(myFilePath));
if (isResize) {// 等比缩放
double rate1 = ((double) srcimg.getWidth(null))
/ (double) width + 0.1;
double rate2 = ((double) srcimg.getHeight(null))
/ (double) height + 0.1;
double rate = rate1 > rate2 ? rate1 : rate2;
new_w = (int) (((double) srcimg.getWidth(null)) / rate);
new_h = (int) (((double) srcimg.getHeight(null)) / rate);
} else {
new_w = width;
new_h = height;
}
Image image = srcimg.getScaledInstance(new_w, new_h,
Image.SCALE_DEFAULT);
tag = new BufferedImage(new_w, new_h, BufferedImage.TYPE_INT_RGB);
Graphics g = tag.getGraphics();
g.drawImage(image, 0, 0, null); // 绘制缩小后的图
g.dispose();
return tag;
} catch (Exception e) {
e.printStackTrace();
}
return tag;
}
public void saveImgToDB(BufferedImage bi) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BufferedImage tag = bi;
try {
ImageIO.write(tag, "jpg", baos);
byte[] bytes = baos.toByteArray();
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
String strsql = "update imgtest set img=? where id=1";
DBConnect dbcSelect = new DBConnect(strsql);
dbcSelect.setBinaryStream(1, bis, bytes.length);
dbcSelect.executeUpdate();
dbcSelect.close();
} catch (Exception e) {
}
}
}
④上面的Upload.java文件中同样也用到了另一个自定义的数据库连接类DBConnect.java,源码如下:
package util;
import java.io.InputStream;
import java.sql.*;
public class DBConnect {
private Connection conn = null;
private Statement stmt = null;
private PreparedStatement prepstmt = null;
public static final int JADMIS_CONNECT = 3;
public static final int FTFORDE_CONNECT = 2;
public static final int WEBSITE_CONNECT = 1;
public static final int PLATFORM_CONNECT = 0;
void init() {
try {
Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
conn = DriverManager.getConnection("proxool.mysql");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
void init(String conName) {
try {
Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
conn = DriverManager.getConnection("proxool." + conName);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public DBConnect(int ConnectIndex) throws SQLException {
switch (ConnectIndex) {
case JADMIS_CONNECT:
init("jadmis");
break;
case WEBSITE_CONNECT:
init("website");
break;
case PLATFORM_CONNECT:
init("mysql");
break;
case FTFORDE_CONNECT:
init("ftde");
break;
}
stmt = conn.createStatement();
}
public DBConnect(int ConnectIndex, int resultSetType,
int resultSetConcurrency) throws SQLException {
switch (ConnectIndex) {
case JADMIS_CONNECT:
init("jadmis");
break;
case WEBSITE_CONNECT:
init("website");
break;
case PLATFORM_CONNECT:
init("mysql");
break;
case FTFORDE_CONNECT:
init("ftde");
break;
}
stmt = conn.createStatement(resultSetType, resultSetConcurrency);
}
public DBConnect() throws SQLException {
init();
stmt = conn.createStatement();
}
public DBConnect(int resultSetType, int resultSetConcurrency)
throws SQLException {
init();
stmt = conn.createStatement(resultSetType, resultSetConcurrency);
}
public DBConnect(String sql) throws SQLException {
init();
this.prepareStatement(sql);
}
public DBConnect(String sql, int resultSetType, int resultSetConcurrency)
throws SQLException {
init();
this.prepareStatement(sql, resultSetType, resultSetConcurrency);
}
//added by tmw 080221
public DBConnect(int ConnectIndex,String sql) throws SQLException {
switch (ConnectIndex) {
case WEBSITE_CONNECT:
init("website");
break;
case PLATFORM_CONNECT:
init("ft");
break;
case FTFORDE_CONNECT:
init("ftde");
break;
case JADMIS_CONNECT:
init("mysql");
break;
}
this.prepareStatement(sql);
}
//added by tmw 080221
public DBConnect(int ConnectIndex,String sql, int resultSetType, int resultSetConcurrency)
throws SQLException {
switch (ConnectIndex) {
case WEBSITE_CONNECT:
init("website");
break;
case PLATFORM_CONNECT:
init("ft");
break;
case FTFORDE_CONNECT:
init("ftde");
break;
case JADMIS_CONNECT:
init("mysql");
break;
}
this.prepareStatement(sql, resultSetType, resultSetConcurrency);
}
public Connection getConnection() {
return conn;
}
public void prepareStatement(String sql) throws SQLException {
prepstmt = conn.prepareStatement(sql);
}
public void prepareStatement(String sql, int resultSetType,
int resultSetConcurrency) throws SQLException {
prepstmt = conn.prepareStatement(sql, resultSetType,
resultSetConcurrency);
}
public void setString(int index, String value) throws SQLException {
prepstmt.setString(index, value);
}
public void setInt(int index, int value) throws SQLException {
prepstmt.setInt(index, value);
}
public void setBoolean(int index, boolean value) throws SQLException {
prepstmt.setBoolean(index, value);
}
public void setDate(int index, Date value) throws SQLException {
prepstmt.setDate(index, value);
}
public void setLong(int index, long value) throws SQLException {
prepstmt.setLong(index, value);
}
//add by sch
public void setDouble(int index, double value) throws SQLException {
prepstmt.setDouble(index, value);
}
//add by sch
public void setObject(int index, Object value)throws SQLException {
prepstmt.setObject(index,value);
}
public void setFloat(int index, float value) throws SQLException {
prepstmt.setFloat(index, value);
}
public void setBytes(int index, byte[] value) throws SQLException {
prepstmt.setBytes(index, value);
}
public void setBinaryStream(int index, InputStream is, int length)
throws SQLException {
prepstmt.setBinaryStream(index, is, length);
}
public void clearParameters() throws SQLException {
prepstmt.clearParameters();
prepstmt = null;
}
public PreparedStatement getPreparedStatement() {
return prepstmt;
}
public Statement getStatement() {
return stmt;
}
public ResultSet executeQuery(String sql) throws SQLException {
if (stmt != null) {
return stmt.executeQuery(sql);
} else
return null;
}
public ResultSet executeQuery() throws SQLException {
if (prepstmt != null) {
return prepstmt.executeQuery();
} else
return null;
}
public void executeUpdate(String sql) throws SQLException {
if (stmt != null)
stmt.executeUpdate(sql);
}
public void executeUpdate() throws SQLException {
if (prepstmt != null)
prepstmt.executeUpdate();
}
public void close() throws SQLException {
if (stmt != null) {
stmt.close();
stmt = null;
}
if (prepstmt != null) {
prepstmt.close();
prepstmt = null;
}
if (conn != null) {
conn.close();
conn=null;
}
}
}
⑤此外,由于用到了proxool数据库连接池,所以需要添加proxool.xml并修改web.xml配置文件,proxool.xml源码如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- the proxool configuration can be embedded within your own application's.
Anything outside the "proxool" tag is ignored. -->
<something-else-entirely>
<proxool>
<alias>mysql</alias>
<driver-url>jdbc:jtds:sqlserver://localhost:1433;DatabaseName=lwjtest</driver-url>
<driver-class>net.sourceforge.jtds.jdbc.Driver</driver-class>
<driver-properties>
<property name="user" value="sa" />
<property name="password" value="sa />
</driver-properties>
<maximum-connection-count>5000</maximum-connection-count>
<minimum-connection-count>5</minimum-connection-count>
<maximum-active-time>60000</maximum-active-time>
</proxool>
</something-else-entirely>
web.xml配置文件代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!--Connecting Pool -->
<servlet>
<servlet-name>ServletConfigurator</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
<init-param>
<param-name>xmlFile</param-name>
<param-value>WEB-INF/proxool.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>Admin</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Admin</servlet-name>
<url-pattern>/admin</url-pattern>
</servlet-mapping>
<!--Connecting Pool Over -->
<servlet>
<servlet-name>ImgDealServlet</servlet-name>
<servlet-class>servlet.ImgDealServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ImgDealServlet</servlet-name>
<url-pattern>/ImgDealServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>upfile.jsp</welcome-file>
</welcome-file-list>
</web-app>
⑥此外,还需要导入几个jar包,jspsmartupload.jar、jtds-1.1.jar和proxool-0.9.0RC3.jar,至于这三个包是做什么用的,我想就不用我多说了吧。
两个图片我用的都是BufferedImage类,因为不同了解流的用法,所以可能会有些不当。此外,还有一点要说明的是,如果jsp文件中字符编码格式用utf-8时,不支持图片的中文路径,改为gb2312就OK了。
由于是第一次发帖,且源码基本为本人及朋友所改写,错误及不当之处一定不少,还请大家多多指教,在此谢过!
分享到:
相关推荐
本文将深入探讨移动端图片上传压缩的相关知识点,包括压缩技术的选择、压缩策略、性能优化以及兼容性问题。 首先,我们需要了解图片的格式,常见的有JPEG、PNG、WebP等。JPEG适用于照片类图片,支持有损压缩,能...
本文将深入探讨“单张图片上传压缩”的相关知识点。 1. **图片格式与压缩原理** - 常见的图片格式有JPEG、PNG、GIF等,其中JPEG适用于照片类图像,因为它支持有损压缩,能显著减小文件大小。PNG则适合图标、设计稿...
根据给定文件的信息,本文将深入探讨“图片上传压缩处理”的相关知识点,包括该功能的重要性、实现原理以及具体的代码分析。 ### 图片上传压缩处理的重要性 在互联网应用中,图片是用户界面的重要组成部分之一。...
因此,前端图片上传压缩变得至关重要。 标题中的“前端图片上传压缩”指的就是在客户端(用户浏览器)对图片进行压缩处理,减少图片的大小,然后将其上传到服务器。这种技术通常用于优化用户体验,提高上传效率,并...
本文将详细讨论“完美PHP图片上传压缩程序”的核心知识点,包括PHP图片处理、图片上传和等比缩放。 首先,PHP提供了GD库和Imagick库等内置工具,用于处理和操作图像。GD库是最基础的图像处理库,支持JPEG、PNG、GIF...
"图片上传压缩裁剪.zip"这个压缩包提供了一种解决方案,它基于photoClip扩展来实现图片上传、裁剪和压缩的功能,确保在电脑和手机上都能完美运行,并且实现起来非常简单。以下是对这个知识点的详细说明: 1. **图片...
【jQuery图片上传压缩预览代码】是一个利用HTML5特性实现的JavaScript库,它结合了jQuery的优势,为用户提供了一种高效且便捷的图片上传、压缩和预览的功能。这个功能在现代网页应用中非常常见,特别是在涉及到用户...
然而,原生的Element UI 图片上传组件并不支持图片的质量压缩功能。因此,为了满足这一需求,我们需要对其进行二次封装,以便在用户上传图片之前对其进行压缩。 图片质量压缩是通过调整图片的位深度、颜色模式和...
综上所述,实现移动端图片上传压缩支持Android、iOS及PC端,需要掌握多平台的图片处理技术,合理选择压缩方式,优化性能,并确保跨平台兼容性。同时,还需要根据具体业务需求进行定制,如设定合适的图片格式、大小...
4. **图片压缩**:为了减少上传的大小和提高上传速度,通常需要对图片进行压缩。可以使用Canvas API的`toDataURL()`方法将图片绘制到Canvas上,然后调整Canvas的宽度和高度来实现等比例缩放,再导出为新的DataURL,...
这个"HTML5+jQuery图片上传压缩预览代码.zip"压缩包包含了一套实用的解决方案,适用于那些需要在网站上实现图片上传和预览功能的开发者。下面我们将详细探讨其中涉及的关键知识点。 首先,HTML5引入了一系列新的API...
在移动Web蓬勃发展的今天,有太多太多的应用需要让用户在移动Web上传图片文件了,正因如此,我们有些困难必须去攻克: 低网速下上传进度缓慢,用户体验差 高并发下,后台处理较大的上传文件压力大 或许有更多...
url: '***', // 这里填写你的图片上传接口地址 path: pics // 这里是选取的图片的地址数组 }); } ``` 需要注意的是,在微信小程序中,图片的压缩和处理不仅限于上述的`wx.chooseImage`方法。我们还可以通过调整`...
在给定的【标题】"图片上传及压缩类"和【描述】"图片压缩。上传类 android."中,我们可以提取出两个主要知识点:图片压缩和图片上传。 首先,我们来看图片压缩。在Android中,由于内存限制和网络传输速度的考虑,...
本文将详细探讨一个重要的技术实现——“图片上传组件(自带图片压缩)”,该组件基于jQuery、Spring、Struts2和iBatis框架,具有实际应用价值,并已在公司项目中大规模使用。 首先,我们来理解一下这个组件的关键...
该功能主要针对移动端用户,提供了便捷的图片上传、压缩及旋转处理。以下是一些相关知识点: 1. Vue.js框架:Vue是一套用于构建用户界面的渐进式JavaScript框架,主要用于开发单页面应用程序(SPA)。它允许开发者...
图片或文件上传类,其中对图片上传进行处理,如进行压缩,加水印;因为有些图片过大,但运营人员又不能修改,只里在此设置图片大小,图片即可按比例压缩。
在这个场景中,我们关注的是ASP.NET中的图片上传功能,以及如何在上传的图片上加印文字和对图片进行压缩。 1. **图片上传**: 在ASP.NET中,图片上传通常涉及到HTML表单(form)的`<input type="file">`元素,用户...
1、用户通过文件选择空间选择图片,图片选择好,自动在线压缩...4、必须在PHP环境下操作才能实现上传压缩保存能正常使用,否则只能进行前端图片压缩和预览功能 5、界面比较简单,没有进行过多的修饰,用户可以自行修改
很实用;上传的速度也很快哦;大家不妨试试;