zoukankan      html  css  js  c++  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 = null;
            if (file == null){
                return buffer;
            } else {             
                try {     
                    FileInputStream fis = new FileInputStream(file);  
                    ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);  
                    byte[] b = new byte[1000];  
                    int n;  
                    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();  
                }
                
            }
              
             return buffer;  
      }   
    由于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 = null;
            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 = null;  
            FileOutputStream fileOut = null;  
            File file = null;  
            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中显示图片的代码
    总得来说,这是图片上传比较基本的方法,不适用于上传大批量文件的情况。
     
  • 相关阅读:
    Ubuntu 20.04 不能远程连接
    CentOS 6.8 设置开机自动联网
    JSON 语法
    用友U8 | 【成本管理】用友U8卷积运算时警告提示:‘’有未记账非委外加工入库单代管挂账确认单‘’
    用友U8 | 【总账】总账结账时,对账不平
    用友U8 | 【应收款管理】取消核销操作
    用友U8 | 【总账】账簿明细账打印,选择科目打印,页数范围超过了430页,之后的内容都显示不出来
    用友U8 | 【存货核算】存货模块删除凭证时提示:当前凭证已经有实时核销处理,不能被作废(或删除)!
    用友U8 | 【存货核算】存货核算模块,凭证处理,查询凭证时,会计年度选择不到2021年度
    用友U8 | 【总账】科目辅助总账与科目辅助明细账数据不一样
  • 原文地址:https://www.cnblogs.com/ProgramerWorldOfMe/p/5149238.html
Copyright © 2011-2022 走看看