精华内容
参与话题
问答
  • 图片类:picture.javapublic class Picture implements java.io.Serializable { private String pictureid; private String picversion; private String kind; //图片类型:光学图片、遥感图片等 private byte...

    图片类:picture.java

    public class Picture implements java.io.Serializable {
        private String pictureid; 
        private String picversion;
        private String kind; //图片类型:光学图片、遥感图片等
        private byte[] picture; //图片字节数组
        ……

    hibernate文件:

    <hibernate-mapping>
        <class name="org.military.po.Picture" table="picture" schema="MilitaryMS">
            <id name="pictureid" type="string">
                <column name="pictureid" length="100" />
                <generator class="assigned" />
            </id>
            <property name="picversion" type="string">
                <column name="picversion" length="100" not-null="true" />
            </property>
            <property name="kind" type="string">
                <column name="kind" length="50" not-null="true" />
            </property>
            <property name="picture" type="binary">
                <column name="picture" />
            </property>
        </class>
    </hibernate-mapping>

    实现功能将指定目录下的图片保存到数据库中,关键代码:
    所有的图片路径都存放在session参数imagesPath中,依次取出所有路径,将该路径下的文件保存入数据库中。

    Map<String,String> imagesPath=(HashMap<String,String>) ActionContext.getContext().getSession().get("imagesPath");
    Iterator itr= imagesPath.entrySet().iterator();
    while(itr.hasNext()){
        Map.Entry<String,String> entry=(Entry<String, String>) itr.next();
        String imagepath=entry.getKey();
        String type=entry.getValue();
        FileInputStream fin;    
        byte[] buffer=new byte[1024];
        int len=0;
        try {           
            fin=new FileInputStream(imagepath);             
            ByteArrayOutputStream fos=new ByteArrayOutputStream();
            while((len=fin.read(buffer))!=-1){
                fos.write(buffer, 0, len);
            }
            pictureService.savePicture(new Picture(imagepath,shipversion,type,fos.toByteArray()));
        } catch (IOException e) {
                e.printStackTrace();
        }
    }

    在jsp中显示图片
    jsp页面显示

    <img data-src= "holder.js/300x200" src= '<%=path%>/imageShowAction?version= <s:property value= "version" /> ' onError= "this.src='./image/nopic.jpg'" alt= "Generic placeholder thumbnail" style=" width: 330px; height : 220px;">

    struts配置文件:

    <action name= "imageShowAction" class ="imageUploadAction"  method= "showImage">
          <result name= "null" type ="stream">
               <param name="contentType" >image/ jpeg,image/bmp ,image/png,image/ gif,image/jpeg ,image/pjpeg</param >
          </result>
    </action>

    注意其中的name必须为null。
    action类:

    public class ImageUploadAction extends ActionSupport
          {
            private PictureService pictureService ;
            private String version ;
            private HttpServletResponse response ;
            private ServletOutputStream sout ;//二进制流可以直接在 jsp页面显示  
           get和set函数……
    
           public String showImage() {
                   Picture picture = pictureService.queryOnePicByVersion(version );
                   byte[] pic=null ;
                   if(picture!=null){
                          pic=picture.getPicture();
                          response=ServletActionContext. getResponse();
                          response.setContentType( "image/jpeg");   
                          try {
                                sout= this.response .getOutputStream();                  
                                sout.write(pic,0,pic. length);            
                                sout.flush();
                                sout.close();
                         } catch (IOException e) {
                                // TODO Auto-generated catch block
                               e.printStackTrace();
                         }
                  }
           return null ;
           }       
    }

    注意该处的返回值为null。对应配置文件中的name=“null”

    展开全文
  • [图片说明](https://img-ask.csdn.net/upload/201504/30/1430397279_519425.png) web.xml: ![图片说明](https://img-ask.csdn.net/upload/201504/30/1430397413_941846.png) action: ![图片说明]...
  • 由于项目需求要对项目中的图片进行数据库存储,这就意味着我们以前常用的通过servlet单独进行图片上传的方法就不太方便了(虽然不是说不可以,我们可以先提交到服务器生成文件,再返回文件名,然后提交数据到服务器...

    由于项目需求要对项目中的图片进行数据库存储,这就意味着我们以前常用的通过servlet单独进行图片上传的方法就不太方便了(虽然不是说不可以,我们可以先提交到服务器生成文件,再返回文件名,然后提交数据到服务器的时候通过文件名获取文件再进行存储,但是这tm也太麻烦了吧)。于是就想有没有什么办法能直接从form表单里就对图片进行上传呢?心动不如行动,马上就干起来。

    先交代一下背景,项目框架使用的是velocity+spring+hibernate,数据库使用的MySQL,这次进行的实验是在之前有同学完成的后台管理模块的基础上进行的。

    首先,我们从页面端开始。我们一般情况下提交数据给服务器,都是在页面上的form表单里添加input元素,并设置name属性,在提交之后再服务器端通过request.getParameter()方法就可以获取数据。然而当我们在我们的form表单中加了一个<input type="file" name="imgurl" />的时候,却突然发现在服务器端String imgUrl = map.get("imgurl");获得的值为null,这就奇怪了为啥他就是要搞特殊呢?仔细一看发现,原来是因为form表单不同的数据格式的原因,简单引用网上的资料可知:

    在Form元素的语法中,通过EncType表明提交数据的格式 
    用 Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型。 
    下边是说明: 
    application/x-www-form-urlencoded: 窗体数据被编码为名称/值对。这是标准的编码格式。 
    multipart/form-data: 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。 
    text/plain: 窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。
     
    补充
    form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded。 
    当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2...),然后把这个字串append到url后面,用?分割,加载这个新的url。 
    当action为post时候,浏览器把form数据封装到http body中,然后发送到server。 
    如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了。 
    但是如果有type=file的话,就要用到multipart/form-data了。浏览器会把整个表单以控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符

    至于具体multipart/form-data格式封装的http请求是什么样子的,这个就自己通过浏览器去看看吧,网上资料也很多。如这个讲的还行

    于是,马上把form加上属性enctype="multipart/form-data",再次提交一看,顿时蒙逼了,不止是文件属性为null了,连之前的其他几个属性值现在也变成null了,这特么什么情况,仔细一想,对了,刚才资料里看过的,修改了数据的提交格式以后,数据不再是键值对,肯定不能再以同样的方式进行获取了,马上继续找相关内容,网上也有很多的解决办法。大家可以参考,我的解决方式如下:
    try {
    			request.setCharacterEncoding("utf-8");
    		} catch (UnsupportedEncodingException e1) {
    			e1.printStackTrace();
    		}
            response.setCharacterEncoding("utf-8");
            response.setContentType("text/html;charset=utf-8");
            Map<String, String> map=new HashMap<>();// 用于存储表单非二进制流部分
            Map<String, Object> jsonMap = new HashMap<String, Object>();
            
            boolean isMultipart = ServletFileUpload.isMultipartContent(request);// 检查输入请求是否为multipart表单数据。
            if (isMultipart == true) {   // 如果是二进制流形式的表单
            	Blob bb = null;
                FileItemFactory factory = new DiskFileItemFactory();// 通过它来解析请求。执行解析后,所有的表单项目都保存在一个List中。
                ServletFileUpload upload = new ServletFileUpload(factory);
                List<FileItem> items = null;
                try {
                    items = upload.parseRequest(request);
                } catch (FileUploadException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                Iterator<FileItem> itr = items.iterator();
                while (itr.hasNext()) {
                    FileItem item = (FileItem) itr.next();
                    if (item.isFormField()) {//检测是否为普通表单 如果是普通表单项目,将其名字与对应的value值放入map中。
                        String fieldName = item.getFieldName();
                        try {
    						map.put(fieldName, item.getString("UTF-8"));
    					} catch (UnsupportedEncodingException e) {
    						e.printStackTrace();
    					}//获取表单value时确定数据格式,如果不写,有中文的话会乱码
                        
                    } else {   //如果是提交的图片
                         bb = Hibernate.createBlob(item.get());
                    }
                    
                }
    
                String privilegeName = map.get("privilegename");	
    			String userNum = map.get("usernum");
    			String funUrl = map.get("funurl");
    
    //接下来这部分就是数据的存储啦,这个自己搞定
    
    }
    按理说,到了这步,我们应该是已经能成功的把图片以BLOB的格式存储到数据库中了(其中hibernate映射那部分就不说了,和其他的类型没什么区别的)!当然,大家的可能也真的是可以成功的了。然而。。。我发现服务器上仍然获取不到数据,这就奇了个怪了,头发抓掉一大把,再看看页面源码,突然发现原来提交部分同学为了解决重复刷新的问题,竟然使用了ajax提交而不是form的submit。。。当时就醉了。那前面这些东西不是白搞了(当然,其实没白搞,知识还是学到了)!然后又去找,通过ajax如何提交multipart/form-data格式的数据,结果还真找到了一大堆,其中,比较感兴趣的就是html5的一个新对象,叫FormData,具体例子在这里。所以,又对提交的页面进行修改:
                                                    var formElement = document.getElementById("form_submit");
    						var formData = new FormData(formElement);
    						formData.append("serialnumber", "hello formdata");
    						alert(formData);
    						jQuery
    								.ajax({
    									type : "post",
    									url : "$!request.getContextPath()/MemberPrivilegeAction.do?method=addMemberPrivilege",
    									data : formData,// 你的formid
    									async : false,
    									contentType : false,
    									processData : false,
    
    									success : function(data) {
    										if (data.success) {
    											alert("添加成功!");
    											window.location.href = "$!request.getContextPath()/MemberPrivilegeAction.do?method=memberPrivilegeManage";
    										} else {
    											alert(data.msg);
    										}
    									},
    									dataType : 'json'
    								});

    再次断点调试,偶也,数据终于成功存到数据库了,工程终于完成了一半。


    那么接下来,就是数据的展示了。首先,通过hibernate把数据库中的BOLB类型数据取出来,没什么问题,只要映射文件配置好,和其他的字段是没区别的。但是,找把图片展示到页面上那就有问题了。找了很多种方法,正方偏方试了一遍,最终发现,还是通过servlet来获取比较靠谱,比如这里。那么问题就来了,我的项目里有很多地方都用得到图片,我不可能为每个图片都写个servlet来进行显示,这样显然是很不科学的。于是就想到了通过java 的反射机制来解决这个问题,通过servlet参数传过来要显示的实体和实体的某个属性以及数据的主键id,再到数据库中获取对应的数据进行展示。于是,就有了下面的这个servlet:
    /**
     * 
     */
    package com.yykj.web.servlet;
    
    import java.io.IOException;
    import java.sql.Blob;
    import java.sql.SQLException;
    
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.yykj.web.export.Reflection;
    import com.yykj.web.util.ServiceFactory;
    
    /**
     * @author lixueweikm@gmail.com
     * @date 2016年7月30日
     */
    public class BlobImgServlet extends HttpServlet {
    
    	private static final String CONTENT_TYPE = "image/gif ";
    
    	private static final String SERVICE_PACKAGE = "com.yykj.service.";
    
    	private static final String MODEL_PACKAGE = "com.yykj.dao.model.";
    
    	/*
    	 * (non-Javadoc)
    	 * 
    	 * @see
    	 * javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest
    	 * , javax.servlet.http.HttpServletResponse)
    	 */
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    			throws ServletException, IOException {
    		String entrty = req.getParameter("entrtyName");
    		String attribute = req.getParameter("attributeName");
    		String entrtyid = req.getParameter("entrtyid");
    		entrty = captureName(entrty);
    		Class<?> serviceBean = null;
    		Blob blob = null;
    		try {
    			serviceBean = Class.forName(SERVICE_PACKAGE + entrty + "Service");
    			//这里是通过spring进行service层的依赖注入,获得实体对应的service类
    			Object oservice = ServiceFactory.getService(serviceBean);
    			//这是一个反射的工具类
    			Reflection re = new Reflection();
    			Object omodel = re.invokeMethod(oservice, "get" + entrty + "ById",
    					new String[] { entrtyid });
    			blob = (Blob) re.getProperty(omodel, attribute);
    		} catch (ClassNotFoundException e1) {
    			e1.printStackTrace();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		
    		if (blob != null) {
    			try {
    				int fileSize = (int) blob.length();
    				byte[] ab = blob.getBytes(1, fileSize);
    				resp.setContentType(CONTENT_TYPE);
    				resp.setContentLength(fileSize);
    				ServletOutputStream op = resp.getOutputStream();
    				op.write(ab);
    				op.flush();
    				op.close();
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    	}
    
    	/*
    	 * (non-Javadoc)
    	 * 
    	 * @see
    	 * javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest
    	 * , javax.servlet.http.HttpServletResponse)
    	 */
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    			throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		this.doGet(req, resp);
    	}
    
    	// 首字母大写
    	public static String captureName(String name) {
    		char[] cs = name.toCharArray();
    		if(Character.isLowerCase(cs[0])){
    			cs[0] -= 32;
    		}
    		return String.valueOf(cs);
    
    	}
    }
    

    在页面端要显示图片的地方加上<img src="$request.getContextPath()/bimg?entrtyName=MemberPrivilege&attributeName=imgUrl&entrtyid=$!p.privilegeId"/>一看,哎哟喂,果然可以。至此,打完收工。大笑
    对了,那反射工具类也gx一下看看:

    package com.yykj.web.export;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    public class Reflection {
    	public Object invokeMethod(Object owner, String methodName, Object[] args)
    			throws Exception {
    
    		Class ownerClass = owner.getClass();
    
    		Class[] argsClass = new Class[args.length];
    
    		for (int i = 0, j = args.length; i < j; i++) {
    			if (args[i] != null) {
    				argsClass[i] = args[i].getClass();
    			} else {
    				argsClass[i] = String.class;
    			}
    		}
    
    		Method method = ownerClass.getMethod(methodName, argsClass);
    
    		return method.invoke(owner, args);
    	}
    
    	public Object getProperty(Object owner, String fieldName) throws Exception {
    		Class ownerClass = owner.getClass();
    
    		Field field = ownerClass.getDeclaredField(fieldName);
    
    		field.setAccessible(true);
    		
    		Object property = field.get(owner);
    
    		return property;
    	}
    
    	public Object getClass(String className) throws InstantiationException,
    			IllegalAccessException, ClassNotFoundException {
    		Object obj = Class.forName(className).newInstance();
    		return obj;
    	}
    }
    


    展开全文
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
    <%@page import="java.io.PrintWriter"%>  
    <%@page import="java.io.OutputStream"%>  
    <%@page import="java.io.InputStream"%>  
    <%@page import="java.sql.ResultSet"%>  
    <%@page import="net.sysmain.common.ConnectionManager"%>  
    <%@page import="java.sql.PreparedStatement"%>  
    <%@page import="java.sql.Connection"%>  
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
    <%  
        response.reset();  
        String guid = request.getParameter("guid");  
        Connection conn = null;  
        PreparedStatement ps = null;  
        ResultSet rs = null;  
        InputStream is = null;  
        OutputStream os = null;  
        try{  
            conn = ConnectionManager.getInstance().getConnection();  
            ps = conn.prepareStatement("select img from user where guid=?");  
            ps.setString(1, guid);  
            rs = ps.executeQuery();  
            if(rs.next()){  
                is = rs.getBinaryStream(1);  
            }  
            response.setContentType("image/jpeg");  
            os = response.getOutputStream();  
            int num;  
            byte buf[] = new byte[1024];  
            while(   (num=is.read(buf))!=-1   ){  
                os.write(buf, 0, num);  
            }  
            os.flush();  
            is.close();  
            os.close();  
        }catch(Exception e){  
            e.printStackTrace();  
        }finally{  
            ConnectionManager.close(conn,ps,rs);  
        }  
    %>
     

    页面显示代码:

     

     

    <img style="width:73px" src="<%=request.getContextPath() %>/showImg.jsp?guid=<%=guid %>" />

    转载于:https://my.oschina.net/u/555639/blog/226928

    展开全文
  • jsp页面显示blob图片

    2012-05-07 10:30:02
    购物网站的商品图片比较多, 推荐是图片保存到文件夹,路径保存到数据库。 但是我还需要将blob类型的图片显示在jsp页面上, 对于前段这个不是很熟悉.. 这个jsp该做哪些
  • &lt;%@page import="java.io.PrintWriter"%&gt; &lt;%@page import="java.io.OutputStream"%&gt; &lt;%@page import="java.io.InputStream"...%&

    <%@page import="java.io.PrintWriter"%>  
    <%@page import="java.io.OutputStream"%>  
    <%@page import="java.io.InputStream"%>  
    <%@page import="java.sql.ResultSet"%>  
    <%@page import="net.sysmain.common.ConnectionManager"%>  
    <%@page import="java.sql.PreparedStatement"%>  
    <%@page import="java.sql.Connection"%>  
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
    <%  
        response.reset();  
        String guid = request.getParameter("guid");  
        Connection conn = null;  
        PreparedStatement ps = null;  
        ResultSet rs = null;  
        InputStream is = null;  
        OutputStream os = null;  
        try{  
            conn = ConnectionManager.getInstance().getConnection();  
            ps = conn.prepareStatement("select img from user where guid=?");  
            ps.setString(1, guid);  
            rs = ps.executeQuery();  
            if(rs.next()){  
                is = rs.getBinaryStream(1);  
            }  
            response.setContentType("image/jpeg");  
            os = response.getOutputStream();  
            int num;  
            byte buf[] = new byte[1024];  
            while(   (num=is.read(buf))!=-1   ){  
                os.write(buf, 0, num);  
            }  
            os.flush();  
            is.close();  
            os.close();  
        }catch(Exception e){  
            e.printStackTrace();  
        }finally{  
            ConnectionManager.close(conn,ps,rs);  
        }  
    %>  
     

    页面显示代码:

     

     

    <img style="width:73px" src="<%=request.getContextPath() %>/showImg.jsp?guid=<%=guid %>" />
    展开全文
  • 读取并显示mysql中的BLOB图片

    千次阅读 2019-08-20 09:10:38
    项目需要将存入mysql数据库中的图片显示出来,Controller中方法如下: @RequestMapping(value="/getPhoto.do",method=RequestMethod.GET) public void getPhotoById (int id, int width, int height, final ...
  • NULL 博文链接:https://w123456h19.iteye.com/blog/1201279
  • 近期,在给客户做一个Demo页面时,需要用JAVA读取Oracle中的blob图片字段并显示,在此过程中,遇到一些问题,例如:连接Oracle数据库读取blob字段数据,对图片byte数据进行缩放等;特此记录,给自己备忘,给大家参考...
  • 后端:将数据库中的blob对象转换成byte[],再转换成base64字符串 前端:用image标签的src接收base64编码的数据流 2.代码实现 前端代码: js: wx.request({ url: '...
  • 主要介绍了Java从数据库中读取Blob对象图片显示的方法,实例分析了Java读取数据库中Blob对象图片的技巧与操作方法,需要的朋友可以参考下
  • ajax、blob类型显示图片

    千次阅读 2018-09-16 22:24:08
    第一种方式(推荐):  1: protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { File file = new File("e:/1.jpg"...
  • 读取 blob 图片 显示在网页(转)

    千次阅读 2017-01-06 21:24:51
    1.图片存储在图片的存储字段方面,SQL Server和My SQL都有相应的字段,而在Oracle里没有明确的字段,但也提供了几个大型字段,一般,我们存储在BLOB类型里。这里有个CLOB和BLOB字段的讨论,网上学习之后知道,BLOB...
  • blob格式的数据从数据库中读取出来并弄成BufferedImage 的形式 Blob Simage = rs.getBlob(1); BufferedImage bi1 = ImageIO.read(new ByteArrayInputStream(Simage.getBytes(1, (int) Simage.length()))); ...
  • oracle blob 图片jsp显示

    2013-04-09 19:20:10
    01. 02. 03. 04. 05. 06. 07. 08. 09. 10. response.reset(); 11. String guid = request.getParameter("guid"); 12. Connection co
  • JSP页面直接显示Blob类型图片

    千次阅读 2012-12-27 08:21:20
    做了一个JSP直接显示Oracle的Blob类型图片的小功能,参考代码如下: response.reset(); String guid = request.getParameter("guid"); Connection conn = null; PreparedSta
  • BLOB 数据类型,现在已经比较少的出现了,这样设计使数据库冗余。 此处为使用Spring Mvc +Mybatis 技术。 查询BLOB数据我使用直接查询一个实体类,实体类对应的数据类型为Byte[] 数组。 前台页面查看时候,给...
  • 存放的为二进制,显示的时候就需要转换了拿图片为例,例如数据库中mypic字段类型为blob byte[] byteImg = (byte[])dr["mypic"]; System.IO.MemoryStream ms = new System.IO.MemoryStream(byteImg);Syst...
  • js将后台的blob格式图片显示在本地

    千次阅读 2019-01-30 14:27:44
    直接上代码: ...xhr.responseType = “blob”; xhr.open(“GET”,url,true); xhr.setRequestHeader(key,value); xhr.onload = function(){ if(xhr.status == 200){ var blob = this.response; v...

空空如也

1 2 3 4 5 ... 20
收藏数 546
精华内容 218
关键字:

显示blob图片