大白是小白
2017-08-21 01:42
采纳率: 75%
浏览 5.4k

MySQL数据库存储图片怎样更高效

请教各位大神,图片在数据库中以什么格式或者怎样处理能让其在读写时能够更加高效一些?
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

7条回答 默认 最新

  • 鼠小 2017-08-21 01:46
    已采纳

    图片一般是不存数据库的,,,存路径,,

    文件和图片一样,存数据库里,查找通常也是按照名字查找,,,何必给数据库带来不必要的压力

    点赞 评论
  • 图片和文件存数据库存路径或名字,存数据库是入门时知道有这个功能就行了。

    点赞 评论
  • 算不算码农 2017-08-21 01:58

    存储的图片用BLOB 不过不能超过64k 大图不行
    大图用 MEDIUMBLOB 或者LONGBLOB
    存放到数据库还要涉及到转换。

    不过图片资源可以放到服务器 存放路径要比存放资源好的多。

    点赞 评论
  • dreamwinter 2017-08-21 02:21

    建议使用非关系型数据库进行存储

    点赞 评论
  • MEMCOPY- 2017-08-21 02:22

    大哥 谁告诉你数据库存文件的啊? 存放的都是文件路径或者名字 或者路径加密值 文件都放在文件服务器上好不啦

    点赞 评论
  • lintees 2017-08-21 04:00

    图片在数据库中尽量存入路径字段

    图片具体存放到服务器中,在跟项目同级或者其中创建图片存放文件夹, 分类存放就好

    点赞 评论
  • codingboy333 2021-09-17 17:05

    不知道提问的同学具体的使用场景。不论是存路径,还是直接 base64 存到 BLOB 里,都需要按照你的场景来讨论怎么做最好。方法没有绝对的好坏,只有适不适合。

    存路径比较好理解。我来说说什么情况下需要直接把图片、文件和数据存一张表里吧。仅供参考。

    比如上百万件产品列表,产品信息和产品照片存在一起,在你迁移备份时,非常灵活。另外就是加载速度也不一样,某些场景下图片直接存数据库,对于前端加载有非常大的意义。

    推荐一下这篇,讲了 BLOB 数据类型在实际应用中的意义和作用。这篇带着大家一起实现了一个学校学生花名册的应用。把学生的信息和学生证件照存在同一张表中,调取,迁移,备份都超级方便。这就是 BLOB 其中一个应用的意义。

    接着我来说说如何把图片存成 base64 到 MySQL 的问题。

    本地图片转base64编码

    /**
         * @Description: 将图片转换成base64编码的字符串
         * @param @param imageSrc 文件路径
         * @param @return
         * @return String
         * @throws IOException
         */
        public static String imageToBase64(String imageSrc) throws IOException {
            //判断文件是否存在
            File file=new File(imageSrc);
            if(!file.exists()){
                throw new FileNotFoundException("文件不存在!");
            }
            StringBuilder pictureBuffer = new StringBuilder();
            FileInputStream input=new FileInputStream(file);
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            //读取文件
            Base64 base64=new Base64();
            byte[] temp = new byte[1024];
            for(int len = input.read(temp); len != -1;len = input.read(temp)){
                out.write(temp, 0, len);
            }
            pictureBuffer.append(new String( base64.encodeBase64Chunked(out.toByteArray())));
            input.close();
            return pictureBuffer.toString();
        }
    
    

    网络图片url转base64编码

    import java.io.ByteArrayOutputStream;
    import java.io.DataInputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
     
    import sun.misc.BASE64Encoder;
     
     
    public class imgToBase64 {
     
        public static void main(String[] args) throws Exception {
            String url="https://pic.imgdb.cn/item/614201662ab3f51d91e492b3.jpg";
            String a = aa.getBase64ByUrl(url);
            System.out.println(a);
        }
     
        /**
         * 根据图片链接转为base64数据
         *
         * @param imageUrl
         * @return
         * @throws Exception
         */
        public static String getBase64ByUrl(String imageUrl) throws Exception {
            // new一个URL对象
            URL url = new URL(imageUrl);
            // 打开链接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            // 设置请求方式为"GET"
            conn.setRequestMethod("GET");
            // 超时响应时间为5秒
            conn.setConnectTimeout(5 * 1000);
            // 通过输入流获取图片数据
            InputStream inStream = conn.getInputStream();
            // 得到图片的二进制数据,以二进制封装得到数据,具有通用性
            byte[] data = readInputStream(inStream);
            BASE64Encoder encode = new BASE64Encoder();
            String s = encode.encode(data);
            return s;
        }
     
        private static byte[] readInputStream(InputStream inStream) throws Exception {
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            // 创建一个Buffer字符串
            byte[] buffer = new byte[1024];
            // 每次读取的字符串长度,如果为-1,代表全部读取完毕
            int len = 0;
            // 使用一个输入流从buffer里把数据读取出来
            while ((len = inStream.read(buffer)) != -1) {
                // 用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
                outStream.write(buffer, 0, len);
            }
            // 关闭输入流
            inStream.close();
            // 把outStream里的数据写入内存
            return outStream.toByteArray();
        }
     
    }
     
    

    希望对你有所帮助,有帮助的话,点个赞再走吧。

    点赞 评论

相关推荐 更多相似问题