file和multipartfile相互转化及其poi提取图片


一,poi导入excel时提取图片

上传的excel

FileInputStream fs = (FileInputStream) file1.getInputStream();
            HSSFWorkbook workbook = null;
            if (".xls".equals(suffix)) {
                workbook = new HSSFWorkbook(fs);
            } else if (".xlsx".equals(suffix)) {
                workbook = (HSSFWorkbook) WorkbookFactory.create(fs);
            }
            ...
		//基本信息
        HSSFSheet sheet_jbxx = (HSSFSheet) workbook.getSheetAt(3);
        import_jbxx(sheet_jbxx,fileName, uuid,request);
			//获取头像
            List list = sheet_jbxx.getDrawingPatriarch().getChildren();
            SAttachmentFile attachmentFile = null;
            for (HSSFShape shape : list) {
                if (shape instanceof HSSFPicture) {
                    HSSFPicture picture = (HSSFPicture) shape;
                    HSSFClientAnchor cAnchor = (HSSFClientAnchor) picture.getAnchor();
                    HSSFPictureData pdata = picture.getPictureData();
                    //获取第几行
                    HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor();
                    //获取行编号
                    int row = anchor.getRow2();
                    //获取列编号
                    int col = anchor.getCol2();
                    if(row!=1&&row==6&&col==4){
                        //文件字节数组
                        byte[] data = pdata.getData();
                        InputStream inputStream = new ByteArrayInputStream(data);
                        MultipartFile file = new MockMultipartFile("test.jpg","test.jpg",ContentType.APPLICATION_OCTET_STREAM.toString(), inputStream);
                        String path="rygl/picture";
                        attachmentFile = fileManagerService.uploadFile(file,path);
                    }else if(row!=1&&(row!=6||col!=4)){
                        isshow=true;
                        jgMsg.append("文件名:"+fileName+",提示:照片读取失败,请在指定单元格内放置照片!;\r\n");
                    }

                }
            }
            if(attachmentFile!=null){
                a01.setZdyxa0106(attachmentFile.getFid());
            }

其中有一个byte数组转为MultipartFile的过程

二,byte数组和MultipartFile户转

MultipartFile转化为byte数组
byte[] imgBytes = multipartFile.getBytes();

byte数组转化为MultipartFile

转换中我们会使用MockMultipartFile这个类,所有要引用相应包。

                
                   org.springframework
                   spring-test
                   RELEASE
                
byte[] testFile = new byte[1024];
InputStream inputStream = new ByteArrayInputStream(testFile);
MultipartFile file = new MockMultipartFile(ContentType.APPLICATION_OCTET_STREAM.toString(), inputStream);

三,file转MultipartFile

引入以下依赖


    commons-fileupload
    commons-fileupload
    1.3.1

public class FileUtil {
    public MultipartFile fileToMultipartFile(File file) {
        FileItem fileItem = createFileItem(file);
        MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
        return multipartFile;
    }
    private static FileItem createFileItem(File file) {
        FileItemFactory factory = new DiskFileItemFactory(16, null);
        FileItem item = factory.createItem("textField", "text/plain", true, file.getName());
        int bytesRead = 0;
        byte[] buffer = new byte[8192];
        try {
            FileInputStream fis = new FileInputStream(file);
            OutputStream os = item.getOutputStream();
            while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.close();
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return item;
    }
}

注意:导入的是org.apache.commons下的包

四,解压zip包

private void unzipAndImportExcels(MultipartFile file,HttpServletRequest request) throws IOException, InvalidFormatException, ParseException {
        //存放解压后的文件目录
        String destDirPath="D:\\工作\\北软工具和工作文件\\冬奥人员信息导入数据材料\\test\\";
        File tempDir=new File(destDirPath);
        //初始化临时目录
        FileUtils.cleanDirectory(tempDir);
        File file1 = new File(destDirPath+file.getOriginalFilename());

        FileUtils.copyInputStreamToFile(file.getInputStream(), file1);
        ZipFile zipFile=new ZipFile(file1, Charset.forName("GBK"));
        Enumeration<?> entries = zipFile.entries();
        while (entries.hasMoreElements()) {
            ZipEntry entry = (ZipEntry) entries.nextElement();
            // 如果是文件夹,就创建个文件夹
            if (entry.isDirectory()) {
                String dirPath = destDirPath + File.separator + entry.getName();
                File dir = new File(dirPath);
                dir.mkdirs();
            }else{
                // 如果是文件,就先创建一个文件,然后用io流把内容copy过去
                File targetFile = new File(destDirPath + File.separator + entry.getName());
                // 保证这个文件的父文件夹必须要存在
                if (!targetFile.getParentFile().exists()) {
                    targetFile.getParentFile().mkdirs();
                }
                targetFile.createNewFile();
                // 将压缩文件内容写入到这个文件中
                InputStream is = zipFile.getInputStream(entry);
                FileOutputStream fos = new FileOutputStream(targetFile);
                int len;
                byte[] buf = new byte[1024];
                while ((len = is.read(buf)) != -1) {
                    fos.write(buf, 0, len);
                }
                // 关流顺序,先打开的后关闭
                fos.close();
                is.close();

            }
        }
        zipFile.close();
        //删除压缩包
        FileUtils.forceDelete(file1);
}