MouldFileServiceImpl.java 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  1. package com.hssx.cloudmodel.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.github.pagehelper.PageHelper;
  4. import com.github.pagehelper.PageInfo;
  5. import com.hssx.cloudmodel.constant.Constant;
  6. import com.hssx.cloudmodel.entity.*;
  7. import com.hssx.cloudmodel.entity.vo.MouldFileVO;
  8. import com.hssx.cloudmodel.entity.vo.UserVO;
  9. import com.hssx.cloudmodel.mapper.*;
  10. import com.hssx.cloudmodel.service.MouldFileService;
  11. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  12. import com.hssx.cloudmodel.util.FileUtil;
  13. import com.hssx.cloudmodel.util.HttpRespMsg;
  14. import com.hssx.cloudmodel.util.ListUtil;
  15. import com.hssx.cloudmodel.util.PageUtil;
  16. import org.apache.commons.lang3.StringUtils;
  17. import org.springframework.stereotype.Service;
  18. import org.springframework.web.bind.annotation.RequestParam;
  19. import org.springframework.web.multipart.MultipartFile;
  20. import javax.annotation.Resource;
  21. import javax.servlet.ServletOutputStream;
  22. import javax.servlet.http.HttpServletRequest;
  23. import javax.servlet.http.HttpServletResponse;
  24. import java.io.*;
  25. import java.net.URLEncoder;
  26. import java.util.*;
  27. import java.util.zip.ZipEntry;
  28. import java.util.zip.ZipOutputStream;
  29. /**
  30. * <p>
  31. * 服务实现类
  32. * </p>
  33. *
  34. * @author 吴涛涛
  35. * @since 2019-08-07
  36. */
  37. @Service
  38. public class MouldFileServiceImpl extends ServiceImpl<MouldFileMapper, MouldFile> implements MouldFileService {
  39. @Resource
  40. UserMapper userMapper;
  41. @Resource
  42. MouldFileMapper mouldFileMapper;
  43. @Resource
  44. MouldOperationDynamicsMapper mouldOperationDynamicsMapper;
  45. @Resource
  46. ProjectMapper projectMapper;
  47. @Resource
  48. MouldMapper mouldMapper;
  49. @Resource
  50. ProjectUserMapper projectUserMapper;
  51. @Resource
  52. ProjectApproveMapper projectApproveMapper;
  53. @Resource
  54. PartMapper partMapper;
  55. @Resource
  56. NewsNoticeMapper newsNoticeMapper;
  57. @Resource
  58. NewsNoticeUserMapper newsNoticeUserMapper;
  59. @Override
  60. public HttpRespMsg addFile(UserVO userVO, Integer blongType, MultipartFile file, MultipartFile file2, String path) {
  61. HttpRespMsg msg = new HttpRespMsg();
  62. User user = userMapper.selectOne(new QueryWrapper<User>().eq("head_imgurl", userVO.getToken()));
  63. if (user != null) {
  64. if (file != null && !file.isEmpty()) {
  65. MouldFile projectFile = new MouldFile();
  66. projectFile.setUplodtorId(user.getId());
  67. projectFile.setUploadtor(user.getUsername());
  68. projectFile.setModelId(userVO.getMouldId());
  69. File dir = null;
  70. dir = new File(path);
  71. // D://cloud/upload 文件上传后所存储的位置,部署到服务器上时配置服务器地址即可
  72. if (!dir.exists()) {
  73. dir.mkdirs();
  74. }
  75. String fileName = "";
  76. if (file != null && !file.isEmpty()) {
  77. fileName = file.getOriginalFilename();
  78. projectFile.setFileName(fileName);
  79. projectFile.setFileSize(FileUtil.getReadableFileSize(file.getSize()));
  80. System.out.println("上传文件名称" + file.getName() + ", dir = " + dir.getAbsolutePath());
  81. int pos = fileName.lastIndexOf(".");
  82. String rand = UUID.randomUUID().toString().replaceAll("-", "");
  83. String sufix = fileName.substring(pos);
  84. fileName = rand + sufix;
  85. projectFile.setFileType(sufix);//文件后缀
  86. projectFile.setFileUrl("/upload/" + fileName);
  87. projectFile.setBlongType(blongType);
  88. if (user.getSubordinateType() == 0) {
  89. //上传人为资产方,自动审核通过
  90. projectFile.setState(1);
  91. } else if (user.getSubordinateType() == 1) {
  92. //上传人为生产方,自动审核通过
  93. projectFile.setState(2);
  94. } else {
  95. projectFile.setState(0);
  96. }
  97. File saveFile = new File(dir, fileName);
  98. try {
  99. saveFile.createNewFile();
  100. file.transferTo(saveFile);
  101. } catch (IOException e) {
  102. e.printStackTrace();
  103. projectFile = null;
  104. } catch (Exception e) {
  105. e.printStackTrace();
  106. projectFile = null;
  107. }
  108. //模具报废情况下,设置files2
  109. if (blongType == 5 && file2 != null && !file2.isEmpty()) {
  110. String fileName2 = file2.getOriginalFilename();
  111. projectFile.setFileName2(fileName2);
  112. projectFile.setFileSize2(FileUtil.getReadableFileSize(file2.getSize()));
  113. System.out.println("上传文件2名称" + file2.getName() + ", dir = " + dir.getAbsolutePath());
  114. pos = fileName2.lastIndexOf(".");
  115. rand = UUID.randomUUID().toString().replaceAll("-", "");
  116. sufix = fileName2.substring(pos);
  117. fileName2 = rand + sufix;
  118. projectFile.setFileType2(sufix);//文件后缀
  119. projectFile.setFileUrl2("/upload/" + fileName2);
  120. File saveFile2 = new File(dir, fileName2);
  121. try {
  122. saveFile2.createNewFile();
  123. file2.transferTo(saveFile2);
  124. } catch (IOException e) {
  125. e.printStackTrace();
  126. projectFile = null;
  127. } catch (Exception e) {
  128. e.printStackTrace();
  129. projectFile = null;
  130. }
  131. }
  132. //零件文档时存上零件id
  133. if (blongType == 1 && null != userVO.getPartId()) {
  134. projectFile.setPartId(userVO.getPartId());
  135. }
  136. //上传零件文档和上传模具文档的时候需要区分是否为2D或者3D
  137. if (userVO.getDwgType() != null) {
  138. projectFile.setDwgType(userVO.getDwgType());
  139. }
  140. mouldFileMapper.insert(projectFile);
  141. //添加上传记录
  142. MouldOperationDynamics dynamics = new MouldOperationDynamics();
  143. dynamics.setContent(Constant.UPLOAD);
  144. dynamics.setFileName(file.getOriginalFilename());
  145. dynamics.setOperatorId(user.getId());
  146. dynamics.setFileId(projectFile.getId());
  147. dynamics.setOperatorName(user.getUsername());
  148. dynamics.setMouldId(userVO.getMouldId());
  149. dynamics.setBelongType(blongType);
  150. mouldOperationDynamicsMapper.insert(dynamics);
  151. //添加消息通知记录
  152. Mould mould = mouldMapper.selectById(userVO.getMouldId());
  153. if (mould.getProjectId() != null) {
  154. Project project = projectMapper.selectOne(new QueryWrapper<Project>().eq("id", mould.getProjectId()));
  155. List<ProjectApprove> projectApproves = projectApproveMapper.selectList(new QueryWrapper<ProjectApprove>().eq("project_id", project.getId()));
  156. String content = "";
  157. for (ProjectApprove projectApprove : projectApproves) {
  158. NewsNotice newsNotice = new NewsNotice();
  159. newsNotice.setRefId(projectFile.getId());
  160. newsNotice.setProjectId(project.getId());
  161. newsNotice.setProjectName(project.getProjectName());
  162. newsNotice.setNoticeType(Constant.APPROVEL_TYPE);
  163. if (blongType == 0) {
  164. content = "模具文档";
  165. } else if (blongType == 1) {
  166. content = "零件文档";
  167. } else if (blongType == 2) {
  168. content = "试模验收文档";
  169. } else if (blongType == 3) {
  170. content = "保养方案文档";
  171. } else if (blongType == 4) {
  172. content = "模具更新文档";
  173. } else if (blongType == 5) {
  174. content = "模具报废文档";
  175. }
  176. newsNotice.setContent("有新的" + content + ",待您审批。");
  177. newsNoticeMapper.insert(newsNotice);
  178. NewsNoticeUser newsNoticeUser = new NewsNoticeUser();
  179. newsNoticeUser.setUserId(user.getId());
  180. newsNoticeUser.setNewsId(newsNotice.getId());
  181. newsNoticeUserMapper.insert(newsNoticeUser);
  182. }
  183. }
  184. }
  185. msg.data = projectFile;
  186. }
  187. } else {
  188. msg.setError("当前用户不存在或者未登录");
  189. }
  190. return msg;
  191. }
  192. @Override
  193. public HttpRespMsg check(Integer mouldFileId, Integer isPass, UserVO userVO) {
  194. HttpRespMsg msg = new HttpRespMsg();
  195. User user = userMapper.selectOne(new QueryWrapper<User>().eq("head_imgurl", userVO.getToken()));
  196. MouldFile mf = new MouldFile();
  197. mf.setId(mouldFileId);
  198. MouldFile oldData = mouldFileMapper.selectById(mouldFileId);
  199. if (user != null) {
  200. if (user.getSubordinateType() == 0) {
  201. //资产方
  202. if (isPass == 1) {
  203. if (oldData.getState() == 2) {//生产方也审核通过了
  204. mf.setState(3);
  205. //审批的是模具报废文件
  206. if(oldData.getBlongType()==5){
  207. //将模具修改为已报废
  208. Mould mould = new Mould();
  209. mould.setId(oldData.getModelId());
  210. mould.setState(4+"");//4已报废状态
  211. mouldMapper.updateById(mould);
  212. }
  213. } else {
  214. mf.setState(1);
  215. }
  216. } else {
  217. mf.setState(-1);
  218. }
  219. mouldFileMapper.updateById(mf);
  220. } else if (user.getSubordinateType() == 1) {
  221. //生产方
  222. if (isPass == 1) {
  223. if (oldData.getState() == 1) {//资产方也审核通过了
  224. mf.setState(3);
  225. //将模具修改为已报废
  226. if(oldData.getBlongType()==5){
  227. Mould mould = new Mould();
  228. mould.setId(oldData.getModelId());
  229. mould.setState(4+"");//4已报废状态
  230. mouldMapper.updateById(mould);
  231. }
  232. } else {
  233. mf.setState(2);
  234. }
  235. } else {
  236. mf.setState(-2);
  237. }
  238. mouldFileMapper.updateById(mf);
  239. } else {
  240. msg.setError("只有生产方和资产方才能审核, subordinteType = " + user.getSubordinateType() + ", 无效!");
  241. }
  242. }
  243. return msg;
  244. }
  245. @Override
  246. public HttpRespMsg dowloadFile(MouldFile projectFile, String token) {
  247. HttpRespMsg msg = new HttpRespMsg();
  248. User user = userMapper.selectOne(new QueryWrapper<User>().eq("head_imgurl", token));
  249. //添加上传记录
  250. MouldFile file = mouldFileMapper.selectById(projectFile.getId());
  251. MouldOperationDynamics dynamics = new MouldOperationDynamics();
  252. dynamics.setContent(Constant.DOWNLOAD);
  253. dynamics.setFileName(file.getFileName());
  254. dynamics.setOperatorId(user.getId());
  255. dynamics.setOperatorName(user.getUsername());
  256. dynamics.setMouldId(file.getModelId());
  257. dynamics.setFileId(file.getId());
  258. dynamics.setBelongType(file.getBlongType());
  259. mouldOperationDynamicsMapper.insert(dynamics);
  260. return msg;
  261. }
  262. @Override
  263. public HttpRespMsg getAllFileList(int mouldId, UserVO userVO) {
  264. List<HashMap> dataList = new ArrayList<HashMap>();
  265. int maxBlongType = 5;
  266. for (int i = 0; i <= maxBlongType; i++) {
  267. HashMap<String, Object> data = new HashMap<>();
  268. data.put("blongType", i);
  269. List<MouldFile> list = mouldFileMapper.selectList(new QueryWrapper<MouldFile>().eq("model_id", mouldId).eq("blong_type", i).orderByDesc("id"));
  270. data.put("list", list);
  271. dataList.add(data);
  272. }
  273. HttpRespMsg msg = new HttpRespMsg();
  274. msg.data = dataList;
  275. return msg;
  276. }
  277. @Override
  278. public HttpRespMsg getFileList(int mouldId, Integer blongType, UserVO userVO) {
  279. HttpRespMsg msg = new HttpRespMsg();
  280. User user = userMapper.selectOne(new QueryWrapper<User>().eq("head_imgurl", userVO.getToken()));
  281. List<MouldFile> list = mouldFileMapper.selectList(new QueryWrapper<MouldFile>().eq("model_id", mouldId).eq("blong_type", blongType).orderByDesc("id"));
  282. msg.data = list;
  283. return msg;
  284. }
  285. @Override
  286. public HttpRespMsg delFile(MouldFile mouldFile) {
  287. HttpRespMsg msg = new HttpRespMsg();
  288. msg.data = mouldFileMapper.deleteById(mouldFile.getId());
  289. return msg;
  290. }
  291. @Override
  292. public HttpRespMsg getListByUserAndProjectId(UserVO userVO, PageUtil page) {
  293. HttpRespMsg msg = new HttpRespMsg();
  294. List<Integer> proIds = new ArrayList<>();
  295. proIds.add(-1);
  296. List<MouldFileVO> list = new ArrayList<>();
  297. User currentUser = userMapper.selectOne(new QueryWrapper<User>().eq("head_imgurl", userVO.getToken()));
  298. PageHelper.startPage(page.getPageNum(), page.getPageSize());
  299. if (currentUser != null) {
  300. if (Constant.SYS_ID == currentUser.getParentId()) {
  301. //此时是admin,查询他所创建的项目
  302. QueryWrapper<Project> qw = new QueryWrapper<>();
  303. List<Project> projects = projectMapper.selectList(qw.eq("creator_id", currentUser.getId()));
  304. for (Project pro : projects) {
  305. proIds.add(pro.getId());
  306. }
  307. list = mouldFileMapper.getFileListByProjectId(userVO, proIds);
  308. } else if (Constant.SYS_PARENT_ID == currentUser.getParentId()) {
  309. //系统管理员
  310. List<Project> projects = projectMapper.selectList(new QueryWrapper<Project>());
  311. for (Project pro : projects) {
  312. proIds.add(pro.getId());
  313. }
  314. list = mouldFileMapper.getFileListByProjectId(userVO, proIds);
  315. } else {
  316. QueryWrapper<Project> qw = new QueryWrapper<>();
  317. qw.eq("manager_id", userVO.getId());
  318. List<Project> projects = projectMapper.selectList(qw);
  319. if (projects.size() > 0) {
  320. for (Project project : projects) {
  321. proIds.add(project.getId());
  322. }
  323. }
  324. // //充当普通人员参与的项目
  325. List<ProjectUser> projectUsers = projectUserMapper.selectList(new QueryWrapper<ProjectUser>().eq("user_id", userVO.getId()));
  326. if (projectUsers.size() > 0) {
  327. for (ProjectUser projectUser : projectUsers) {
  328. proIds.add(projectUser.getProjectId());
  329. }
  330. }
  331. //充当审批人员参与的项目
  332. List<ProjectApprove> projectss = projectApproveMapper.selectList(new QueryWrapper<ProjectApprove>().eq("approver_id", userVO.getId()));
  333. if (projectss.size() > 0) {
  334. for (ProjectApprove projectUser : projectss) {
  335. proIds.add(projectUser.getProjectId());
  336. }
  337. }
  338. list = mouldFileMapper.getFileListByProjectId(userVO, proIds);
  339. }
  340. PageInfo<MouldFileVO> pageInfos = new PageInfo<>(list);
  341. msg.data = pageInfos;
  342. } else {
  343. msg.setError("用户不存在或者未登录");
  344. }
  345. return msg;
  346. }
  347. @Override
  348. public HttpRespMsg dowloadFileList(UserVO userVO, HttpServletRequest request, HttpServletResponse response, String downloadPath,String path) throws IOException {
  349. HttpRespMsg msg = new HttpRespMsg();
  350. if (null != userVO.getIds()) {
  351. List<Integer> ids = ListUtil.convertIntegerIdsArrayToList(userVO.getIds());
  352. for (Integer id : ids) {
  353. Mould mould = mouldMapper.selectById(id);
  354. List<MouldFile> mouldFiles = mouldFileMapper.selectList(new QueryWrapper<MouldFile>().eq("model_id", id).eq("state", 3));
  355. feedBackDirectMultiDownload(request, response, downloadPath, mould, mouldFiles,path);
  356. }
  357. }
  358. return msg;
  359. }
  360. @Override
  361. public HttpRespMsg addPartFile(UserVO userVO, String path, MultipartFile[] files) {
  362. HttpRespMsg msg = new HttpRespMsg();
  363. User user = userMapper.selectOne(new QueryWrapper<User>().eq("head_imgurl", userVO.getToken()));
  364. if (user != null) {
  365. List<Part> partLists = partMapper.selectList(new QueryWrapper<Part>().eq("mould_id", userVO.getMouldId()));
  366. for (MultipartFile file : files) {
  367. MouldFile partFile = new MouldFile();
  368. partFile.setModelId(userVO.getMouldId());
  369. partFile.setBlongType(1);
  370. File dir = null;
  371. dir = new File(path);
  372. // D://cloud/upload 文件上传后所存储的位置,部署到服务器上时配置服务器地址即可
  373. if (!dir.exists()) {
  374. dir.mkdirs();
  375. }
  376. String fileName = "";
  377. // if (!file.isEmpty()) {
  378. fileName = file.getOriginalFilename();
  379. String fileNamePrex = fileName.substring(0, fileName.lastIndexOf("."));
  380. String[] split = fileNamePrex.split("\\+");
  381. System.out.println("split" + split);
  382. for (Part part : partLists) {
  383. if (part.getPartNo().equals(split[0])) {
  384. partFile.setPartId(part.getId());
  385. }
  386. if (Constant.PART_FILE_2D.equals(split[1])) {
  387. partFile.setDwgType(0);
  388. }
  389. if (Constant.PART_FILE_3D.equals(split[1])) {
  390. partFile.setDwgType(1);
  391. }
  392. }
  393. partFile.setFileName(fileName);
  394. partFile.setFileSize(FileUtil.getReadableFileSize(file.getSize()));
  395. System.out.println("上传文件名称" + file.getName() + ", dir = " + dir.getAbsolutePath());
  396. int pos = fileName.lastIndexOf(".");
  397. String rand = UUID.randomUUID().toString().replaceAll("-", "");
  398. String sufix = fileName.substring(pos);
  399. fileName = rand + sufix;
  400. partFile.setFileType(sufix);//文件后缀
  401. partFile.setFileUrl("/upload/" + fileName);
  402. partFile.setUplodtorId(user.getId());
  403. partFile.setUploadtor(user.getUsername());
  404. File saveFile = new File(dir, fileName);
  405. mouldFileMapper.insert(partFile);
  406. try {
  407. saveFile.createNewFile();
  408. file.transferTo(saveFile);
  409. } catch (IOException e) {
  410. e.printStackTrace();
  411. partFile = null;
  412. } catch (Exception e) {
  413. e.printStackTrace();
  414. partFile = null;
  415. }
  416. //添加上传记录
  417. MouldOperationDynamics dynamics = new MouldOperationDynamics();
  418. dynamics.setContent(Constant.UPLOAD);
  419. dynamics.setFileName(file.getOriginalFilename());
  420. dynamics.setOperatorId(user.getId());
  421. dynamics.setOperatorName(user.getUsername());
  422. dynamics.setMouldId(userVO.getMouldId());
  423. mouldOperationDynamicsMapper.insert(dynamics);
  424. // }
  425. msg.data = partFile;
  426. }
  427. } else {
  428. msg.setError("用户不存在或者未登录");
  429. }
  430. return msg;
  431. }
  432. public Map<String, Object> feedBackDirectMultiDownload(HttpServletRequest request, HttpServletResponse response, String downloadPath, Mould vo, List<MouldFile> mouldFiles,String oldFilePath) throws IOException {
  433. //压缩文件初始设置
  434. String path = downloadPath;
  435. String base_name = vo.getModelNo() + vo.getModelName();
  436. String fileZip = base_name + ".zip"; // 拼接zip文件
  437. String filePath = path + "\\" + fileZip;//之后用来生成zip文件
  438. //mouldFiles为根据前台传过来的信息,通过数据库查询所得出的pdf文件路径集合(具体到后缀),此处省略
  439. File[] files = new File[mouldFiles.size()];//
  440. for (int i = 0; i < mouldFiles.size(); i++) {
  441. files[i] = new File(oldFilePath+mouldFiles.get(i).getFileUrl());//获取所有需要下载的pdf
  442. }
  443. // 创建临时压缩文件
  444. try {
  445. BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
  446. ZipOutputStream zos = new ZipOutputStream(bos);
  447. ZipEntry ze = null;
  448. for (int i = 0; i < files.length; i++) {//将所有需要下载的pdf文件都写入临时zip文件
  449. BufferedInputStream bis = new BufferedInputStream(new FileInputStream(files[i]));
  450. ze = new ZipEntry(mouldFiles.get(i).getFileName());
  451. zos.putNextEntry(ze);
  452. int s = -1;
  453. while ((s = bis.read()) != -1) {
  454. zos.write(s);
  455. }
  456. bis.close();
  457. }
  458. zos.flush();
  459. zos.close();
  460. } catch (IOException e) {
  461. e.printStackTrace();
  462. }
  463. //以上,临时压缩文件创建完成
  464. //进行浏览器下载
  465. //获得浏览器代理信息
  466. final String userAgent = request.getHeader("USER-AGENT");
  467. //判断浏览器代理并分别设置响应给浏览器的编码格式
  468. String finalFileName = null;
  469. if (StringUtils.contains(userAgent, "MSIE") || StringUtils.contains(userAgent, "Trident")) {//IE浏览器
  470. finalFileName = URLEncoder.encode(fileZip, "UTF8");
  471. System.out.println("IE浏览器");
  472. } else if (StringUtils.contains(userAgent, "Mozilla")) {//google,火狐浏览器
  473. finalFileName = new String(fileZip.getBytes(), "ISO8859-1");
  474. } else {
  475. finalFileName = URLEncoder.encode(fileZip, "UTF8");//其他浏览器
  476. }
  477. response.setContentType("application/x-download");//告知浏览器下载文件,而不是直接打开,浏览器默认为打开
  478. response.setHeader("Content-Disposition", "attachment;filename=\"" + finalFileName + "\"");//下载文件的名称
  479. ServletOutputStream servletOutputStream = response.getOutputStream();
  480. DataOutputStream temps = new DataOutputStream(
  481. servletOutputStream);
  482. DataInputStream in = new DataInputStream(new FileInputStream(filePath));//浏览器下载文件的路径
  483. byte[] b = new byte[2048];
  484. File reportZip = new File(filePath);//之后用来删除临时压缩文件
  485. try {
  486. while ((in.read(b)) != -1) {
  487. temps.write(b);
  488. }
  489. temps.flush();
  490. } catch (Exception e) {
  491. e.printStackTrace();
  492. } finally {
  493. if (temps != null) temps.close();
  494. if (in != null) in.close();
  495. if (reportZip != null) reportZip.delete();//删除服务器本地产生的临时压缩文件
  496. servletOutputStream.close();
  497. }
  498. return null;
  499. }
  500. }