Kirovj's Chaos
Write whatever I want. Github

真正的新闻,是历史的底稿,这些印在纸上的文与图,是留给时间的物证

一一 财新


记录下写cloud时前后端遇到的一些问题

之前没怎么接触过前端,遇到了很多问题,记录一下。cloud

Vue 及 element-ui 在cdn中可直接引入使用

只不过使用上有些区别,遇到问题在搜索时需要注意。之后前端还是尝试使用工程搭建重构一版,现在仍然是不分离的状态。

axios的使用

axios.post('/cloud/api/delete', {'name': row.name})
   .then(function (res) {
      if (res.data.statusCode === 0) {
            ELEMENT.Message("delete success");
            ft.tableData.splice(index, 1);
      } else {
            ELEMENT.Message.warning("delete failed, " + res.data.msg);
      }
   })

前端下载文件

与请求接口不同,页面上暂时用的js原生 - js原生

window.open('/cloud/download/' + row.name);

局部ajax请求与后端拦截跳转

之前的验证登陆并跳转至login页面是后端实现的:

response.sendRedirect("/login");

这种方法在ajax请求的时候不会自动跳转至登陆页面,所以要在前端执行跳转。

window.location.href = "/login";

后端上传与下载

这里就直接贴下源码

@Allow(role = "admin", redirect = false)
@PostMapping("/upload")
public Res upload(@RequestParam("file") MultipartFile file) {
   try {
      CloudFile cloudFile = new CloudFile();
      cloudFile.setName(file.getOriginalFilename());
      cloudFile.setSize(file.getSize());
      cloudFile.setIn(file.getInputStream());
      cloudService.upload(cloudFile);
      return Res.success();
   } catch (Throwable t) {
      return Res.unknown("/cloud", t.getMessage());
   }
}

@GetMapping("/download/{filename}")
public void download(@PathVariable String filename, HttpServletResponse response) {
   File file = new File(path + File.separator + filename);
   if (file.exists()) {
      response.setContentType("application/octet-stream");
      response.setHeader("Content-Disposition",
               "attachment; filename=" + URLEncoder.encode(filename, StandardCharsets.UTF_8));
      try (BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
            BufferedInputStream in = new BufferedInputStream(new FileInputStream(file))) {

            byte[] b = new byte[1024];
            int len;
            while ((len = in.read(b)) != -1) {
               out.write(b, 0, len);
            }
      } catch (IOException e) {
            log.warn("download error!");
      }
   }
}

下载文件还有其他更方便的实现,比如ResponseEntity等


本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。