xiongzhu %!s(int64=4) %!d(string=hai) anos
pai
achega
ef8f2067cb

+ 34 - 3
src/main/java/com/izouma/awesomeAdmin/service/OrgInfoService.java

@@ -4,28 +4,59 @@ import com.alibaba.excel.EasyExcel;
 import com.izouma.awesomeAdmin.domain.OrgInfo;
 import com.izouma.awesomeAdmin.dto.PageQuery;
 import com.izouma.awesomeAdmin.repo.OrgInfoRepo;
+import com.izouma.awesomeAdmin.service.storage.StorageService;
+import com.izouma.awesomeAdmin.utils.FileUtils;
 import com.izouma.awesomeAdmin.utils.JpaUtils;
 import com.izouma.awesomeAdmin.utils.excel.UploadDataListener;
 import lombok.AllArgsConstructor;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.poi.util.TempFile;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
 import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
 
 @Service
 @AllArgsConstructor
 public class OrgInfoService {
 
-    private OrgInfoRepo orgInfoRepo;
+    private OrgInfoRepo    orgInfoRepo;
+    private StorageService storageService;
 
     public Page<OrgInfo> all(PageQuery pageQuery) {
-        return orgInfoRepo.findAll(JpaUtils.toSpecification(pageQuery, OrgInfo.class), JpaUtils.toPageRequest(pageQuery));
+        return orgInfoRepo
+                .findAll(JpaUtils.toSpecification(pageQuery, OrgInfo.class), JpaUtils.toPageRequest(pageQuery));
     }
 
     public void upload(MultipartFile file) throws IOException {
+        File destDir = TempFile.createTempDirectory("import");
+        FileUtils.unzip(file.getInputStream(), destDir);
+        File xlsxFile = FileUtils.findExcel(destDir);
+        if (xlsxFile == null) return;
         UploadDataListener<OrgInfo> listener = new UploadDataListener<>();
-        EasyExcel.read(file.getInputStream(), OrgInfo.class, listener).sheet().doReadSync();
+        EasyExcel.read(new FileInputStream(xlsxFile), OrgInfo.class, listener).sheet().doReadSync();
+        for (OrgInfo data : listener.getData()) {
+            if (data.getLogo() != null) {
+                File uploadFile = new File(destDir, data.getLogo());
+                if (uploadFile.exists()) {
+                    String path = "images/" + new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date())
+                            + RandomStringUtils.randomAlphabetic(8)
+                            + "." + FilenameUtils.getExtension(uploadFile.getName());
+                    String url = storageService.uploadFromInputStream(new FileInputStream(uploadFile), path);
+                    data.setLogo(url);
+                }
+            }
+        }
         orgInfoRepo.saveAll(listener.getData());
     }
+
 }

+ 55 - 0
src/main/java/com/izouma/awesomeAdmin/utils/FileUtils.java

@@ -10,6 +10,8 @@ import java.nio.file.attribute.PosixFileAttributes;
 import java.nio.file.attribute.PosixFilePermission;
 import java.nio.file.attribute.PosixFilePermissions;
 import java.util.Set;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
 
 public class FileUtils {
 
@@ -200,5 +202,58 @@ public class FileUtils {
 
     }
 
+    public static void unzip(InputStream in, File destDir) throws IOException {
+        byte[] buffer = new byte[1024];
+        ZipInputStream zis = new ZipInputStream(in);
+        ZipEntry zipEntry = zis.getNextEntry();
+        while (zipEntry != null) {
+            File newFile = newFile(destDir, zipEntry);
+            if (zipEntry.isDirectory()) {
+                if (!newFile.isDirectory() && !newFile.mkdirs()) {
+                    throw new IOException("Failed to create directory " + newFile);
+                }
+            } else {
+                // fix for Windows-created archives
+                File parent = newFile.getParentFile();
+                if (!parent.isDirectory() && !parent.mkdirs()) {
+                    throw new IOException("Failed to create directory " + parent);
+                }
+
+                // write file content
+                FileOutputStream fos = new FileOutputStream(newFile);
+                int len;
+                while ((len = zis.read(buffer)) > 0) {
+                    fos.write(buffer, 0, len);
+                }
+                fos.close();
+            }
+            zipEntry = zis.getNextEntry();
+        }
+        zis.closeEntry();
+        zis.close();
+    }
+
+    public static File newFile(File destinationDir, ZipEntry zipEntry) throws IOException {
+        File destFile = new File(destinationDir, zipEntry.getName());
 
+        String destDirPath = destinationDir.getCanonicalPath();
+        String destFilePath = destFile.getCanonicalPath();
+
+        if (!destFilePath.startsWith(destDirPath + File.separator)) {
+            throw new IOException("Entry is outside of the target dir: " + zipEntry.getName());
+        }
+
+        return destFile;
+    }
+
+    public static File findExcel(File dir) {
+        if (!(dir.exists() && dir.isDirectory())) return null;
+        for (File file : dir.listFiles()) {
+            String name = file.getName().toLowerCase();
+            if ((name.endsWith(".xlsx") || name.endsWith(".xls")) && !name.startsWith(".") && !file.isHidden()) {
+                return file;
+            }
+        }
+        return null;
+    }
 }

+ 2 - 1
src/main/java/com/izouma/awesomeAdmin/utils/excel/UploadDataListener.java

@@ -3,11 +3,12 @@ package com.izouma.awesomeAdmin.utils.excel;
 import com.alibaba.excel.context.AnalysisContext;
 import com.alibaba.excel.event.AnalysisEventListener;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 
 public class UploadDataListener<T> extends AnalysisEventListener<T> {
-    private List<T> data;
+    private final List<T> data;
 
     public UploadDataListener() {
         this.data = new ArrayList<>();

+ 3 - 2
src/main/vue/src/mixins/pageableTable.js

@@ -199,8 +199,9 @@ export default {
         importData() {
             let input = document.createElement('input');
             input.type = 'file';
-            input.accept =
-                'application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
+            // input.accept =
+            //     'application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
+            input.accept = 'application/zip, application/octet-stream';
             input.onchange = e => {
                 let form = new FormData();
                 form.append('file', input.files[0]);