如何用java读取java 图片变量到变量里

本文说的是把图片上传到数据库中的Blob类型,从数据库中取出来并显示的问题。框架是基于spring和mybatis的
首先环境配置,如果项目中有图片上传的功能。那么需要对应的JAR和相关配置。
&&1、commons-fileupload-1.2.2.jar
&2、commons-io-2.0.1.jar
要实现SpringMVC的文件上传,需要配置一下文件:
其次,需要说明的是有图片上传提交的表单和没有图片上传提交的表单是不一样的。有图片上传的表单需要在form的设置中添加enctype="multipart/form-data"。例如: 。原因是enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,这个编码格式是application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作.&enctype="multipart/form-data"是上传二进制数据;&form里面的input的值以2进制的方式传过去,所以request就得不到值了。 也就是说加了这段代码,用request就会传递不成功。
当然文件上传的JSP设置参照类型设置成file,自动就有参照按钮(不是所有,待定)了。
然后,先说上传图片,基本思路是把获得的文件转换成byte[]型然后存入数据库中。关于fle类型到byte[]型的转换,下面贴一下工具方法。需要用的可以直接复制。
& & public byte[] getBytes(File file){ &
& & & & byte[] buffer =
& & & & if (file == null){
& & & & & &
& & & & } else { & & & & & &&
& & & & & & try { & &&
& & & & & & & & FileInputStream fis = new FileInputStream(file); &
& & & & & & & & ByteArrayOutputStream bos = new ByteArrayOutputStream(1000); &
& & & & & & & & byte[] b = new byte[1000]; &
& & & & & & & & &
& & & & & & & & while ((n = fis.read(b)) != -1) { &
& & & & & & & & & & bos.write(b, 0, n); &
& & & & & & & & } &
& & & & & & & & fis.close(); &
& & & & & & & & bos.close(); &
& & & & & & & & buffer = bos.toByteArray(); &
& & & & & & } catch (FileNotFoundException e) { &
& & & & & & & & e.printStackTrace(); &
& & & & & & } catch (IOException e) { &
& & & & & & & & e.printStackTrace(); &
& & & & & & }
& & & & & &&
& & & & &&
& & & & & &
由于mysql数据库中中Blob类型的字段其实就是二进制数据,所以可以当成是byte[].也就是表对应的Entity里的该字段的类型设为byte[]数组是没有任何问题。
之后贴一下mybatis的XML的SQL(说明一下,此处要提交的图片名称为logo)
& & update mcompany
& & set name = #{name,jdbcType=VARCHAR},
& & & shortname = #{shortname,jdbcType=VARCHAR},
& & & email = #{email,jdbcType=VARCHAR},
& & & adress = #{adress,jdbcType=VARCHAR}, &&
& & & logo = #{logo,jdbcType=LONGVARBINARY}, & &
& & where code = #{code,jdbcType=VARCHAR}
另外,由于本人在控制器里取表单传过来的文件的时候花了点时间,所以在此贴一下代码
& & @RequestMapping(value = "/save")
& & public String saveMyComDisplay(McompanyForm mcompanyForm,
& & & & & & & & & & & & & & & & & &@RequestParam("uploadfile") CommonsMultipartFile file) {
& & & & byte[] logoBytes =
& & & & if (!file.isEmpty()) {
& & & & & & try { & & & & & & & &
& & & & & & & & logoBytes = file.getBytes(); & & & & & & & &
& & & & & & & & BufferedOutputStream stream =
& & & & & & & & & & & & new BufferedOutputStream(new FileOutputStream(new File("-uploaded")));
& & & & & & & &&
& & & & & & & & stream.write(logoBytes);
& & & & & & & & stream.close();
& & & & & & }catch (Exception e) {
& & & & & & & & return "You failed to upload =& " + e.getMessage();
& & & & & & }
& & & & & &&
& & & & } & & &
& & & & .......................此处省略.................................
其实图片上传还可以传到服务器的固定目录上,在数据库中保存的是图片地址。对于当个的小图片直接转换为二进制存在数据库中个人认为比较合适。
下面再来说图片显示的问题。基本思路是从数据库中取出该图片的byte[],之后转换成File类型的文件并保存到一个相对路径下的临时文件夹里面。JSP从该目录下面读取就可以了。
& 也贴一下byte[]转换为文件类型的工具方法,方便大家复制。
& & public static void byteToFile(byte[] buf, String filePath, String fileName) &
& & & & BufferedOutputStream bufferOut = &
& & & & FileOutputStream fileOut = &
& & & & File file = &
& & & & try &
& & & & { &
& & & & & & File resFile = new File(filePath); &
& & & & & & if (!resFile.exists() && resFile.isDirectory()) &
& & & & & & { &
& & & & & & & & resFile.mkdirs(); &
& & & & & & } &
& & & & & & file = new File(filePath + File.separator + fileName); &
& & & & & & fileOut = new FileOutputStream(file); &
& & & & & & bufferOut = new BufferedOutputStream(fileOut); &
& & & & & & bufferOut.write(buf); &
& & & & } &
& & & & catch (Exception e) &
& & & & { &
& & & & & & e.printStackTrace(); &
& & & & } &
& & & & finally &
& & & & { &
& & & & & & if (bufferOut != null) &
& & & & & & { &
& & & & & & & & try &
& & & & & & & & { &
& & & & & & & & & & bufferOut.close(); &
& & & & & & & & } &
& & & & & & & & catch (IOException e) &
& & & & & & & & { &
& & & & & & & & & & e.printStackTrace(); &
& & & & & & & & } &
& & & & & & } &
& & & & & & if (fileOut != null) &
& & & & & & { &
& & & & & & & & try &
& & & & & & & & { &
& & & & & & & & & & fileOut.close(); &
& & & & & & & & } &
& & & & & & & & catch (IOException e) &
& & & & & & & & { &
& & & & & & & & & & e.printStackTrace(); &
& & & & & & & & } &
& & & & & & } &
& & & & } & & & & &
注意这个方法的目的是在你指定的目录下面新建将数据库存的Blob类型的转换后的一个文件。无返回值。其中参数新建文件的路径,一般情况下为相对路径。
最后贴一下JSP中显示图片的代码
总得来说,这是图片上传比较基本的方法,不适用于上传大批量文件的情况。
阅读(...) 评论()Java用于读取照片图片的EXIF信息
Exif(Exchangeable image file
format)是一种图象文件格式,它的数据存储与JPEG格式相同。实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及全球定位系统(GPS)、缩略图等。简单地说,Exif=JPEG+拍摄参数。因此,你可以利用任何可以查看JPEG文件的看图软件浏览Exif格式的照片,但并不是所有的图形程序都能处理Exif信息。
如果你的Java程序读取Exif信息,那么,Metadata
Extractor就是一个可以直接读取照片(图片)元数据(Metadata)的一个类库,它可以直接从网络上下载:
目前可以下载的版本从metadata-extractor-2.3.1.jar到metadata-extractor-2.6.2.zip,但是两个版本有很大差异,如ExifDirectory在新版本中细分了ExifIFD0Directory、ExifInteropDirectory、ExifSubIFDDirectory、ExifThumbnailDirectory四个类。
下面是用以显示EXIF信息的两个实例:
public class ExifDataReader {
&public static void main(String[] args) throws
Exception {
&&File jpegFile = new
File("C:\\TIF\\DSC_0.JPG");
&&Metadata metadata =
JpegMetadataReader.readMetadata(jpegFile);
&&Directory exif =
metadata.getDirectory(ExifDirectory.class);
&&@SuppressWarnings("rawtypes")
&&Iterator tags =
exif.getTagIterator();
&&while (tags.hasNext()) {
&&&Tag tag =
(Tag) tags.next();
&&&System.out.println(tag);
public class MetaDataReader {
&public static void main(String[] args) throws
Exception {
&&File jpegFile = new
File("C:\\TIF\\DSC_0.JPG");
&&Metadata metadata =
JpegMetadataReader.readMetadata(jpegFile);
&&Directory exif =
metadata.getDirectory(ExifIFD0Directory.class);
&&Collection&Tag&
tags = exif.getTags();
&&Iterator&Tag&
iter = tags.iterator();
&&// 逐个遍历每个Tag
&&while (iter.hasNext()) {
&&&Tag tag =
(Tag) iter.next();
&&&System.out.println(tag);
&&// 检查是否Tag中包含了图片属性-摘要中的作者
(exif.containsTag(ExifIFD0Directory.TAG_WIN_AUTHOR)) {
&&&System.out.println("-&Pic
author is "
exif.getDescription(ExifIFD0Directory.TAG_WIN_AUTHOR));
&&// 检查是否Tag中包含了图片属性-摘要中的标题
(exif.containsTag(ExifIFD0Directory.TAG_WIN_TITLE)) {
&&&System.out.println("-&Pic
title is "
exif.getDescription(ExifIFD0Directory.TAG_WIN_TITLE));
&&// 检查是否Tag中包含了图片属性-摘要中的主题
(exif.containsTag(ExifIFD0Directory.TAG_WIN_SUBJECT)) {
&&&System.out.println("-&Pic
subject is "
exif.getDescription(ExifIFD0Directory.TAG_WIN_SUBJECT));
其中实例2种的ExifIFD0Directory可以换成其他的类名,实例2执行后的结果如下:
[Exif IFD0] Make - NIKON CORPORATION
[Exif IFD0] Model - NIKON D7000
[Exif IFD0] Orientation - Top, left side (Horizontal /
[Exif IFD0] X Resolution - 300 dots per inch
[Exif IFD0] Y Resolution - 300 dots per inch
[Exif IFD0] Resolution Unit - Inch
[Exif IFD0] Software - Ver.1.02
[Exif IFD0] Date/Time -
[Exif IFD0] Artist
-&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
[Exif IFD0] YCbCr Positioning - Datum point
[Exif IFD0] Copyright
-&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
测试时间日。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Java从数据库中读取图片并转化为字符串类型 - 博客频道 - CSDN.NET
TIANLANG3的博客
一个编程菜鸟的世界
分类:Android
*Java从数据库中读取图片并转化为字符串类型
public String getUser(int account){
String msg1=
JSONObject json=new JSONObject();&
JSONArray jsonMembers = new JSONArray();&
JSONObject json1=new JSONObject();
String sql = &select * from yq_user where uaccount=&+
Connection conn = DBUtil.getDBUtil().getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
InputStream in=&
OutputStream out=
while(rs.next()){
in=rs.getBinaryStream(&uimg&); //获取rs结果集中的每张图片
//申明byte数组,用来存放图片流 ,注意图片的大小
byte[] b=new byte[100000];&
in.read(b); //从InputStream对象中读取数据放进byte数组中&
String s = new String(b,&ISO-8859-1&);//注意编码格式,转码格式错误,会导致图片乱码
json1.put(&uaccount&, rs.getInt(&uaccount&));
json1.put(&unick&, rs.getString(&unick&));&
json1.put(&uavatar&,rs.getString(&uavatar&));&
json1.put(&utrends&, rs.getString(&utrends&));&
json1.put(&usex&,rs.getString(&usex&));&
json1.put(&uage&,rs.getInt(&uage&));&
json1.put(&ulev&,rs.getInt(&ulev&));&
json1.put(&uimg&,s);&
jsonMembers.put(json1);&
json.put(&user&, jsonMembers);
msg1=json.toString();
} catch (Exception e) {
e.printStackTrace();
return msg1;
排名:千里之外
(16)(3)(1)(2)(1)(1)(1)(1)(1)java&向数据库中写入硬盘图片,并读取出来
首先先要建一个数据库。。。
文件:D:\xsgl.sql
(由于无法上传
具体的数据文件,大家可自己定义,如果需要我的,请留下EMAIL)&
打开MYSQL(应该都会吧)在命令行输入:
source d:\xsgl.
在JAVA内先要引入JDBC:
然后建立文件:
SaveBlob.java文件:
import java.io.*;
import java.sql.*;
public class SaveBlob {
&public static void
main(String[] args) {
&&&File f=new
File("D:/a.jpg");
&&&FileInputStream
fi=new FileInputStream(f);
&&&Class.forName("com.mysql.jdbc.Driver");
url="jdbc:mysql://localhost:3306/xsgl";
&&&Connection
con=DriverManager.getConnection(url,"root","123");
sql="update students set studPic=? where studNo='101'";
&&&PreparedStatement
psta=con.prepareStatement(sql);
&&&psta.setBinaryStream(1,fi,(int)f.length());
&&&psta.executeUpdate();
&&} catch (ClassNotFoundException
&&&e.printStackTrace();
&&} catch (SQLException e)
&&&e.printStackTrace();
&&} catch (FileNotFoundException
&&&e.printStackTrace();
OutBolb.java文件:
import java.io.*;
import java.sql.*;
import java.awt.*;
import javax.swing.*;
public class OutBlob extends
&//File f=new
File("D:/b.jpg");
&Pic pic=new Pic("D:/b.jpg");
&public OutBlob(){
&&this.setTitle("学生信息管理系统");
&&this.setSize(500,200);
&&this.setVisible(true);
&&this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
&&this.getContentPane().add(pic);
&public static void main(String[] args) {
&&&FileOutputStream
fo=new FileOutputStream("D:/b.jpg");
&&&Class.forName("com.mysql.jdbc.Driver");
url="jdbc:mysql://localhost:3306/xsgl";
&&&Connection
con=DriverManager.getConnection(url,"root","123");
sql="select studPic from students where studNo='101'";
&&&Statement
sta=con.createStatement();
&&&ResultSet
rs=sta.executeQuery(sql);
&&&InputStream
&&&if(rs.next()){
&&&&in=rs.getBinaryStream(1);
&&&while((i=in.read())!=-1){
&&&&fo.write(i);
&&} catch (ClassNotFoundException
&&&e.printStackTrace();
&&} catch (SQLException e)
&&&e.printStackTrace();
&&} catch (FileNotFoundException
&&&e.printStackTrace();
&&} catch (IOException e) {
&&&e.printStackTrace();
&&new OutBlob();
&class Pic extends JPanel{
&&public Pic(String name){
&&&img=Toolkit.getDefaultToolkit().getImage(name);
&&protected void
paintComponent(Graphics arg0) {
&&&// TODO
Auto-generated method stub
&&&//super.paintComponent(arg0);
w=img.getWidth(this);
h=img.getHeight(this);
&&&arg0.drawImage(img,20,10,this);
最终效果如下:
<img NAME="image_operate_95352" src="/blog7style/images/common/sg_trans.gif" real_src ="/middle/631f6b3fge64de6e13ebd&690"
ALT="java&向数据库中写入硬盘图片,并读取出来"
TITLE="java&向数据库中写入硬盘图片,并读取出来" />
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Servlet从本地文件中读取图片,并显示在页面中 - 虾米博客 - ITeye技术网站
博客分类:
import java.io.IOE
import javax.servlet.ServletE
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.sun.image.codec.jpeg.*;//sun公司仅提供了jpg图片文件的编码api
import javax.imageio.stream.*;
import java.awt.*;
import java.awt.image.BufferedI
* 显示文件的Servlet
* 负责从本地文件中读取图片,
public class ShowPic extends javax.servlet.http.HttpServlet implements
javax.servlet.Servlet {
private static final String GIF = "image/charset=GB2312";// 设定输出的类型
private static final String JPG = "image/charset=GB2312";
* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#HttpServlet()
public ShowPic() {
* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request,
HttpServletResponse response)
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request,
HttpServletResponse response)
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String spec = request.getParameter("spec");// 输出图片的类型的标志
String imagePath = "D:\\temp\\1.jpg";
response.reset();
OutputStream output = response.getOutputStream();// 得到输出流
if (imagePath.toLowerCase().endsWith(".jpg"))// 使用编码处理文件流的情况:
response.setContentType(JPG);// 设定输出的类型
// 得到图片的真实路径
// 得到图片的文件流
InputStream imageIn = new FileInputStream(new File(imagePath));
// 得到输入的编码器,将文件流进行jpg格式编码
JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(imageIn);
// 得到编码后的图片对象
BufferedImage image = decoder.decodeAsBufferedImage();
// 得到输出的编码器
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(output);
encoder.encode(image);// 对图片进行输出编码
imageIn.close();// 关闭文件流
if (imagePath.toLowerCase().endsWith(".gif"))// 不使用编码处理文件流的情况:
response.setContentType(GIF);
ServletContext context = getServletContext();// 得到背景对象
InputStream imageIn = context.getResourceAsStream(imagePath);// 文件流
BufferedInputStream bis = new BufferedInputStream(imageIn);// 输入缓冲流
BufferedOutputStream bos = new BufferedOutputStream(output);// 输出缓冲流
byte data[] = new byte[4096];// 缓冲字节数
int size = 0;
size = bis.read(data);
while (size != -1) {
bos.write(data, 0, size);
size = bis.read(data);
bis.close();
bos.flush();// 清空输出缓冲流
bos.close();
output.close();
想要调用的话,你可以简单的映射一下servelt,我就将servet的名映射为
&servlet-name&ShowPic&/servlet-name&
&display-name&ShowPic&/display-name&
&description&&/description&
&servlet-class&
cn.ccb.zlgz.web.servlet.ShowPic&/servlet-class&
&/servlet&
&servlet-mapping&
&servlet-name&ShowPic&/servlet-name&
&url-pattern&/ShowPic&/url-pattern&
&/servlet-mapping&
使用HTML调用:
&img src="ShowPic?spec=2"&&/a&
这样图片便显示在htm上了
浏览 15721
浏览: 983876 次
来自: 深圳
28. 下面哪个Set是排序的?
A. LinkedHas ...
ICMP报文被封装在IP包里,也就是说他是由IP协议承载的,从 ...
真的假的?
少年,发烫是所有智能手机的特点,而莫名发烫是所有安卓手机的特点 ...
试了一下,可以用。如果美化一下控件和窗体更有意思。

我要回帖

更多关于 java 读取系统变量 的文章

 

随机推荐