美文网首页
通过流的方式把文件存到数据库

通过流的方式把文件存到数据库

作者: 枯萎天然呆 | 来源:发表于2023-08-01 15:28 被阅读0次

保存方法

 @Override
    public String uploadFile(MultipartFile file, String fileId) {
        try {
            byte[] baseStr1 =file.getBytes();
//        // 获取文件后缀
            String fileName = file.getOriginalFilename();
            String fileExtension = "";
            int lastIndex = fileName.lastIndexOf('.');
            if (lastIndex > 0)
            {
                fileExtension = fileName.substring(lastIndex + 1);
            }
            ByteArrayInputStream inputStream = new ByteArrayInputStream(baseStr1);

            byte[] chunk = new byte[78000];
            int bytesRead;
            int chunkIndex = 0;
            String s = null;
            if (StringUtils.isBlank(fileId)){
                s = UUID.fastUUID().toString();
            }else{
                s = fileId;
            }

            while ((bytesRead = inputStream.read(chunk)) != -1) {
                FileUploadBlob fileUploadBlob=new FileUploadBlob();
                fileUploadBlob.setBlobData(chunk);
                fileUploadBlob.setChunkIndex(chunkIndex);
                fileUploadBlob.setFileId(s);
                fileUploadBlob.setType(fileExtension);
                fileUploadBlobMapper.insert(fileUploadBlob);
                chunkIndex++;

                // 如果当前块的大小不足70000字节,说明BLOB数据已经全部插入到数据库中
                if (bytesRead < 78000) {
                    break;
                }

                // 否则,读取下一个块
                chunk = new byte[78000];
            }

            inputStream.close();
            return s;
        }catch (IOException e){
            e.printStackTrace();
            log.error(e.getMessage());
            return null;
        }
    }



查询方法

@Override
    public String getFileByte(String fileId) {
        try {
            QueryWrapper<FileUploadBlob> qw =new QueryWrapper<>();
            qw.eq("file_id",fileId);
            qw.orderByAsc("chunk_index");
            List<FileUploadBlob> list = fileUploadBlobMapper.selectList(qw);
//            StringBuffer str = new StringBuffer();
            if (!CollectionUtils.isEmpty(list)){
                Future<String> str = getBaseStr(list);

                String fileSuffix = list.get(0).getType();
                String prefix = "";
                switch (fileSuffix){
                    case "doc":
                        prefix = "data:application/msword;base64,";
                        break;
                    case "docx":
                        prefix = "data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,";
                        break;
                    case "xls":
                        prefix = "data:application/vnd.ms-excel;base64,";
                        break;
                    case "xlsx":
                        prefix = "data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,";
                        break;
                    case "ppt":
                        prefix = "data:application/vnd.ms-powerpoint;base64,";
                        break;
                    case "pptx":
                        prefix = "data:application/vnd.openxmlformats-officedocument.presentationml.presentation;base64,";
                        break;
                    case "pdf":
                        prefix = "data:application/pdf;base64,";
                        break;
                    case "jpg":
                        prefix = "data:image/jpeg;base64,";
                        break;
                    case "png":
                        prefix = "data:image/png;base64,";
                        break;
                    case "gif":
                        prefix = "data:image/gif;base64,";
                        break;
                    case "bmp":
                        prefix = "data:image/bmp;base64,";
                        break;
                    case "tif":
                        prefix = "data:image/tiff;base64,";
                        break;
                    case "txt":
                        prefix = "data:text/plain;base64,";
                        break;
                    case "svg":
                        prefix = "data:image/svg+xml;base64,";
                        break;
                    case "jpeg":
                        prefix = "data:image/jpeg;base64,";
                        break;
                }
                return prefix + str.get();
            }
            return null;
        }catch (Exception e){
            e.printStackTrace();
            log.error(e.getMessage());
            return null;
        }
    }

private static final int RANGE_UNIT = 1024 * 1024 * 4;
//多线程通过字节流获取base64
     public String getBaseStr(List<FileUploadBlob> list){
        StringBuffer str = new StringBuffer();
        try {
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            for (FileUploadBlob chunk : list) {
                byte[] chunkData = chunk.getBlobData();
                outputStream.write(chunkData);
                //防止内存溢出
                if (chunkData.length > RANGE_UNIT) {
                    byte[] blobData = outputStream.toByteArray();
                    String s = java.util.Base64.getEncoder().encodeToString(blobData);
                    str.append(s);
                    outputStream.flush();
                    outputStream.close();

                }
            }
            byte[] blobData = outputStream.toByteArray();
            String s = java.util.Base64.getEncoder().encodeToString(blobData);
            outputStream.flush();
            outputStream.close();
            str.append(s);
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }

        return str.toString();
    }

相关文章

  • Hibernate--一级缓存--事务

    一 什么是缓存1 数据存到数据库里面,数据库本身是文件系统,使用流方式操作文件效率不是很高。(1)把数据存到内存里...

  • python 实战案例题目3

    我们现在已经把数据储存到数据库里面了,不管是使用 文件,还是关系型数据库,还是实时流数据库。 把数据存下来,这不是...

  • Hibernate(二)

    1 缓存 1.1 什么是缓存? 数据存到数据库里面,数据库本身是文件系统,使用流操作文件效率不是很高。将数据存在内...

  • iOS数据持久化——SQLite

    一、数据库 数据存储一般都是把数据保存到项目的沙盒中,有以下几种方式: plist 文件读写(writeToFil...

  • 四、Java高级--8、FileOutputStream和Fil

    通过字节流的方式写入文件,FileOutputStream 通过字符流的方式写入文件FileWrite

  • element-Upload组件(用户头像上传)

    上传图片到cos服务器并且把图片路径存到数据库 方式一 () 1.数据库新建表 把图片路径单独存到一个图片表...

  • Python scrapy框架教学(四):保存到数据库

    保存到Redis数据库 保存到数据库和保存到文件中格式类似的,只不过初始化的时候,将本来是打开文件的操作,转为连接...

  • iOS sqlite3数据库使用复习

    iOS APP的数据存储方式有很多,NSUserDefault、plist、归档存到文本文件、sqlite3数据库...

  • python 使用 odoo10 客户端上传文件接口

    一丶上传单个文件 保存到本地文件夹 二丶上传多个文件保存到本地数据库

  • Java输入输出(2)--IO流

    Java的IO流 Java中把不同的输入/输出源(键盘、文件、网络连接)抽象表述为“流”,通过“流”的方式允许程序...

网友评论

      本文标题:通过流的方式把文件存到数据库

      本文链接:https://www.haomeiwen.com/subject/phtupdtx.html