管道基础大数据平台系统开发-【后端】-Server
13693261870
2022-10-21 1ecbd3a0f933606f319feb877fdb17d00fa399a0
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
package com.lf.server.service.all;
 
import com.alibaba.fastjson.JSON;
import com.lf.server.controller.all.BaseController;
import com.lf.server.entity.all.HttpStatus;
import com.lf.server.entity.all.ResponseMsg;
import com.lf.server.entity.all.SettingData;
import com.lf.server.entity.sys.AttachEntity;
import com.lf.server.entity.sys.UserEntity;
import com.lf.server.helper.FileHelper;
import com.lf.server.helper.PathHelper;
import com.lf.server.helper.StringHelper;
import com.lf.server.helper.WebHelper;
import com.lf.server.service.sys.AttachService;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
 
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
 
/**
 * 上传服务类
 * @author WWW
 */
@Service
public class UploadService {
    @Autowired
    PathHelper pathHelper;
 
    @Autowired
    AttachService attachService;
 
    private final static Log log = LogFactory.getLog(UploadService.class);
 
    private static final String NO_FILE = JSON.toJSONString(new ResponseMsg<String>(HttpStatus.NOT_FOUND, "文件找不到"));
 
    /**
     * 上传文件
     */
    public ResponseMsg<String> upload(UserEntity ue, String tab, MultipartFile file, BaseController ctrl) {
        try {
            if (file == null && file.isEmpty()) {
                return ctrl.fail("文件上传为空", null);
            }
            if (file.getSize() > SettingData.MAX_FILE_SIZE) {
                return ctrl.fail(String.format("文件大于 %d MB", SettingData.MAX_FILE_SIZE / 1024 / 1024), null);
            }
 
            // 传输文件
            String oldName = file.getOriginalFilename();
            String filePath = pathHelper.getTempPath(ue.getId()) + File.separator + oldName;
            File newFile = new File(filePath);
            file.transferTo(newFile);
            double sizes = FileHelper.sizeToMb(file.getSize());
 
            // 获取MD5
            String md5 = FileHelper.getFileMd5(filePath);
            AttachEntity entity = attachService.selectByGuid(md5);
            if (entity != null) {
                newFile.delete();
                return ctrl.success("文件已存在", md5);
            }
 
            AttachEntity ae = getAttachEntity(ue, tab, oldName, md5, sizes);
            String targetPath = pathHelper.getConfig().getUploadPath() + File.separator + ae.getPath();
            newFile.renameTo(new File(targetPath));
 
            int rows = attachService.insert(ae);
 
            return rows > 0 ? ctrl.success(md5) : ctrl.fail("保存文件失败", null);
        } catch (Exception ex) {
            return ctrl.fail(ex.getMessage(), null);
        }
   }
 
    /**
     * 获取附件实体类
     */
    protected AttachEntity getAttachEntity(UserEntity ue, String tab, String oldName, String md5, double sizes) {
        AttachEntity entity = new AttachEntity();
        entity.setName(oldName);
        entity.setTab(tab);
        entity.setGuid(md5);
        String subPath = PathHelper.getUploadPath() + File.separator + md5;
        entity.setPath(subPath);
        entity.setSizes(sizes);
        if (ue != null) {
            entity.setCreateUser(ue.getId());
        }
 
        return entity;
    }
 
    /**
     * 下载文件
     */
    public void download(String guid, HttpServletResponse res) {
        try {
            if (StringHelper.isEmpty(guid)) {
                WebHelper.write2Page(res, NO_FILE);
                return;
            }
 
            AttachEntity entity = attachService.selectByGuid(guid);
            if (entity == null) {
                WebHelper.write2Page(res, NO_FILE);
                return;
            }
 
            setDownloadResponse(entity, res);
            String filePath = pathHelper.getConfig().getUploadPath() + File.separator + entity.getPath();
 
            // 通过response对象,获取到输出流
            ServletOutputStream outputStream = res.getOutputStream();
            // 定义输入流,通过输入流读取文件内容
            FileInputStream fileInputStream = new FileInputStream(filePath);
 
            int len = 0;
            byte[] bytes = new byte[1024];
            while ((len = fileInputStream.read(bytes)) != -1) {
                // 通过输入流读取文件数据,然后通过上述的输出流写回浏览器
                outputStream.write(bytes, 0, len);
                outputStream.flush();
            }
 
            // 关闭资源
            outputStream.close();
            fileInputStream.close();
        } catch (Exception ex) {
            try {
                String msg = JSON.toJSONString(new ResponseMsg<String>(HttpStatus.ERROR, "文件下载出错"));
                WebHelper.write2Page(res, msg);
            } catch (Exception e) {
                log.error(e.getMessage(), e);
            }
            log.error(ex.getMessage(), ex);
        }
    }
 
    /**
     * 设置下载响应信息
     */
    private void setDownloadResponse(AttachEntity entity, HttpServletResponse res) throws IOException {
        String fileName = URLEncoder.encode(entity.getName(), "UTF-8");
 
        // 设置响应头中文件的下载方式为附件方式,以及设置文件名
        res.setHeader("Content-Disposition", "attachment; filename=" + fileName);
        // 设置响应头的编码格式为UTF-8
        res.setCharacterEncoding("UTF-8");
 
        // 通过response对象设置响应数据格式(如:"text/plain; charset=utf-8")
        String ext = FileHelper.getExtension(entity.getName());
        String mime = FileHelper.getMime(ext);
        res.setContentType(mime);
    }
}