yanghb
2024-12-17 1287337fd0b0c156ec79712f9a600ebeffefe3a6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
package com.zzg.web.controller.common;
 
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.zzg.common.config.RuoYiConfig;
import com.zzg.common.constant.Constants;
import com.zzg.common.core.domain.AjaxResult;
import com.zzg.common.enums.HouseProductionTypeEnum;
import com.zzg.common.enums.HouseUsingTypeEnum;
import com.zzg.common.utils.StringUtils;
import com.zzg.common.utils.Threads;
import com.zzg.common.utils.file.FileUploadUtils;
import com.zzg.common.utils.file.FileUtils;
import com.zzg.framework.config.ServerConfig;
import com.zzg.system.convert.easyExcel.MultiDropdownWriteHandler;
import com.zzg.system.domain.SysCity;
import com.zzg.system.service.system.ISysCityService;
import com.zzg.web.core.enums.TemplateFileTypeEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
 
/**
 * 通用请求处理
 *
 * @author ruoyi
 */
@RestController
@RequestMapping("/common")
public class CommonController {
    private static final Logger log = LoggerFactory.getLogger(CommonController.class);
 
    @Autowired
    private ServerConfig serverConfig;
    @Autowired
    private ISysCityService sysCityService;
    @Value("${server.config}")
    String myServerConfig;
 
    private static final String FILE_DELIMETER = ",";
 
    /**
     * 通用下载请求
     *
     * @param fileName 文件名称
     * @param delete   是否删除
     */
    @GetMapping("/download")
    public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) {
        try {
            if (!FileUtils.checkAllowDownload(fileName)) {
                throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName));
            }
            String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
            String filePath = RuoYiConfig.getDownloadPath() + fileName;
 
            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
            FileUtils.setAttachmentResponseHeader(response, realFileName);
            FileUtils.writeBytes(filePath, response.getOutputStream());
            if (delete) {
                FileUtils.deleteFile(filePath);
            }
        } catch (Exception e) {
            log.error("下载文件失败", e);
        }
    }
 
    @GetMapping("/download/template")
    public void fileDownload(@RequestParam Integer fileType, HttpServletResponse response) {
        try {
            TemplateFileTypeEnum pathByFileType = TemplateFileTypeEnum.getEnumByFileType(fileType);
            Method generateExampleDataMethod = pathByFileType.getClazz().getMethod("generateExampleData");
 
            Object exampleData = generateExampleDataMethod.invoke(null);
 
            Object headerData;
            if (fileType.equals(TemplateFileTypeEnum.FILE_2.getFileType())) {
                headerData = generateHeaderData();
            } else {
                Method generateHeaderDataMethod = pathByFileType.getClazz().getMethod("generateHeaderData");
                headerData = generateHeaderDataMethod.invoke(null);
            }
 
            FileUtils.setExcelResponseHeader(response, pathByFileType.getFileName());
            ExcelWriterBuilder write = EasyExcelFactory.write(response.getOutputStream(), pathByFileType.getClazz());
            if (Objects.nonNull(headerData)) {
                write.registerWriteHandler((MultiDropdownWriteHandler) headerData);
            }
            write.sheet("sheet")
                    .doWrite(Collections.singletonList(exampleData));
            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
            Threads.sleep(1000);
        } catch (Exception e) {
            log.error("下载文件失败", e);
        }
    }
 
    public MultiDropdownWriteHandler generateHeaderData() {
        Map<Integer, String[]> dropdownOptionsMap = new HashMap<>();
        dropdownOptionsMap.put(0, Arrays.stream(HouseUsingTypeEnum.values())
                .map(HouseUsingTypeEnum::getText)
                .toArray(String[]::new));
        dropdownOptionsMap.put(10, Arrays.stream(HouseProductionTypeEnum.values())
                .map(HouseProductionTypeEnum::getText)
                .toArray(String[]::new));
        List<SysCity> towns = sysCityService.getTowns();
        dropdownOptionsMap.put(12, towns.stream().map(SysCity::getName).toArray(String[]::new));
        return new MultiDropdownWriteHandler(dropdownOptionsMap);
    }
 
    /**
     * 通用上传请求(单个)
     */
    @PostMapping("/upload")
    public AjaxResult uploadFile(MultipartFile file) throws Exception {
        try {
            // 上传文件路径
            String filePath = RuoYiConfig.getUploadPath();
            // 上传并返回新文件名称
            String fileName = FileUploadUtils.upload(filePath, file);
            String url = myServerConfig + fileName;
            AjaxResult ajax = AjaxResult.success();
            ajax.put("url", url);
            ajax.put("fileName", fileName);
            ajax.put("newFileName", FileUtils.getName(fileName));
            ajax.put("originalFilename", file.getOriginalFilename());
            return ajax;
        } catch (Exception e) {
            return AjaxResult.error(e.getMessage());
        }
    }
 
    /**
     * 通用上传请求(多个)
     */
    @PostMapping("/uploads")
    public AjaxResult uploadFiles(List<MultipartFile> files) throws Exception {
        try {
            // 上传文件路径
            String filePath = RuoYiConfig.getUploadPath();
            List<String> urls = new ArrayList<String>();
            List<String> fileNames = new ArrayList<String>();
            List<String> newFileNames = new ArrayList<String>();
            List<String> originalFilenames = new ArrayList<String>();
            for (MultipartFile file : files) {
                // 上传并返回新文件名称
                String fileName = FileUploadUtils.upload(filePath, file);
                String url = serverConfig.getUrl() + fileName;
                urls.add(url);
                fileNames.add(fileName);
                newFileNames.add(FileUtils.getName(file.getOriginalFilename()));
                originalFilenames.add(file.getOriginalFilename());
            }
            AjaxResult ajax = AjaxResult.success();
            ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER));
            ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER));
            ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER));
            ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER));
            return ajax;
        } catch (Exception e) {
            return AjaxResult.error(e.getMessage());
        }
    }
 
    /**
     * 本地资源通用下载
     */
    @GetMapping("/download/resource")
    public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        try {
 
            if (!resource.contains("profile")) {
                // 提取日期部分:20240521
                String datePart = resource.substring(resource.indexOf('/') + 1, resource.indexOf('/') + 9);
                String formattedDate = formatDate(datePart);
                resource = "/profile/upload/" + formattedDate + resource.replace("upload", "");
 
            }
            if (!FileUtils.checkAllowDownload(resource)) {
                throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource));
            }
            // 本地资源路径
            String localPath = RuoYiConfig.getProfile();
            // 数据库资源地址
            String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX);
            // 下载名称
            String downloadName = StringUtils.substringAfterLast(downloadPath, "/");
            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
            FileUtils.setAttachmentResponseHeader(response, downloadName);
            FileUtils.writeBytes(downloadPath, response.getOutputStream());
        } catch (Exception e) {
            log.error("下载文件失败", e);
        }
    }
 
    public static String formatDate(String inputDate) {
        try {
            SimpleDateFormat inputFormat = new SimpleDateFormat("yyyyMMdd");
            Date date = inputFormat.parse(inputDate);
 
            SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy/MM/dd");
            return outputFormat.format(date);
        } catch (ParseException e) {
            return null;
        }
    }
}