vue+java 文件下载

13 篇文章 0 订阅

vue+Java 文件下载

背景
算是第一次,前后端自己琢磨文件下载了。直接上代码吧。
前端代码
<template>
  <div>
    <!-- 列表 -->
    <el-row>
      <el-table :data="docs" ref="docs" style="width: 100%" stripe @sort-change="sort" v-loading="loading">
        <el-table-column prop="docFileName" :label="$t('gts.doc.fileName')" sortable align="center" min-width="10%"></el-table-column>
        <el-table-column prop="id" align="center" min-width="20%">
          <template slot-scope="scope">
            <a @click="download(scope.$index, scope.row)">
              <i class="fas fa-download" style="color:#409EFF"></i>
            </a>
          </template>
        </el-table-column>
      </el-table>
      <div class="pagination">
        <el-pagination
          @size-change="handleSizeChange"
          @current-change="handlePageChange"
          :current-page="page"
          :page-size="limit"
          :total="total"
          :page-sizes="[10, 20, 50, 100]"
          layout="total, sizes, prev, pager, next, jumper"
          :background="true"
        ></el-pagination>
      </div>
    </el-row>
  </div>
</template>

<script>
import { list } from "@/api/gts/document";
import { selectDict } from "@/api/common";
import { cst } from "@/utils/constants";

export default {
  name: "GtsDocument",
  data() {
    return {
      limitNum: 1,
      fileList: [],
      docs: [],
      loading: false,
      page: 1,
      limit: 10,
      total: 0,
    };
  },
  created: function() {
    this.search();
  },
  methods: {
    search() {
      list(this.page, this.limit, this.$route.query.gtsId).then(v => {
        if ("ok" == v.data.msg) {
          this.docs = v.data.rows;
          this.total = v.data.total;
        }
      });
    },
    // 下载事件
    download(index, row) {
      var path = row.docPath + row.docFileName;
      // path例如:D:\home\upload\da975319173641669a6fca212ffd272e\夕阳.jpg
      window.open("http://localhost:8080/api/documents/download?path=" + encodeURI(path));
    },
    sort() {},
    handlePageChange(i) {
      this.page = i;
      this.search();
    },
    handleSizeChange(i) {
      this.limit = i;
      this.search();
    },
  }
};
</script>




后台controller
    /**
     * <p>Description: 下载</p>
     *
     * @param path     路径
     * @param response
     */
    @GetMapping("/api/documents/download")
    public void download(String path, HttpServletResponse response) {
        try {
            // path: 欲下载的文件的路径
            File file = new File(path);
            // 获取文件名 - 设置字符集            String downloadFileName = new String(file.getName().getBytes(StandardCharsets.UTF_8), "iso-8859-1");
            // 以流的形式下载文件
            InputStream fis;
            fis = new BufferedInputStream(new FileInputStream(path));
            byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();
            // 清空response
            response.reset();
            // 设置response的Header
            response.addHeader("Content-Disposition", "attachment;filename=" + downloadFileName);
            response.addHeader("Content-Length", "" + file.length());
            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
            response.setContentType("application/octet-stream");
            toClient.write(buffer);
            toClient.flush();
            toClient.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
页面效果

在这里插入图片描述

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue+Java解析Excel文件的步骤如下: 1. 前端上传Excel文件 在Vue组件中,可以使用`<input type="file">`元素实现文件上传功能。例如: ``` <template> <div> <input type="file" @change="handleFileUpload"> </div> </template> <script> export default { methods: { handleFileUpload(event) { const file = event.target.files[0] // 将文件上传到后端 // ... } } } </script> ``` 2. 后端接收Excel文件 使用Java后台框架,例如Spring Boot,可以在Controller中定义一个接收文件的方法。例如: ``` @PostMapping("/upload") public ResponseEntity<?> uploadFile(@RequestParam("file") MultipartFile file) { // 处理上传的文件 // ... } ``` 3. 使用Apache POI解析Excel文件 使用Java的Apache POI库,可以方便地解析Excel文件。在Controller中,可以使用如下代码解析Excel文件: ``` @PostMapping("/upload") public ResponseEntity<?> uploadFile(@RequestParam("file") MultipartFile file) { try { XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream()); XSSFSheet sheet = workbook.getSheetAt(0); Iterator<Row> rowIterator = sheet.iterator(); while (rowIterator.hasNext()) { Row row = rowIterator.next(); Iterator<Cell> cellIterator = row.cellIterator(); while (cellIterator.hasNext()) { Cell cell = cellIterator.next(); // 处理Excel单元格 // ... } } } catch (IOException e) { e.printStackTrace(); } return ResponseEntity.ok().build(); } ``` 在上述代码中,使用XSSFWorkbook类和XSSFSheet类分别表示Excel文件和工作表。通过调用iterator()方法,可以获取行和单元格的迭代器。然后,可以对每个单元格进行处理,例如读取单元格的值,进行数据校验等等。 4. 将解析结果返回给前端 在处理完Excel文件后,可以将解析结果返回给前端,例如将数据保存到数据库中,或者将数据以JSON格式返回给前端。在Controller中,可以使用如下代码将解析结果返回给前端: ``` @PostMapping("/upload") public ResponseEntity<?> uploadFile(@RequestParam("file") MultipartFile file) { List<Map<String, Object>> data = new ArrayList<>(); try { XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream()); XSSFSheet sheet = workbook.getSheetAt(0); Iterator<Row> rowIterator = sheet.iterator(); while (rowIterator.hasNext()) { Row row = rowIterator.next(); Iterator<Cell> cellIterator = row.cellIterator(); Map<String, Object> rowData = new HashMap<>(); while (cellIterator.hasNext()) { Cell cell = cellIterator.next(); String columnName = cell.getStringCellValue(); Cell valueCell = cellIterator.next(); Object value; if (valueCell.getCellType() == CellType.NUMERIC) { value = valueCell.getNumericCellValue(); } else { value = valueCell.getStringCellValue(); } rowData.put(columnName, value); } data.add(rowData); } } catch (IOException e) { e.printStackTrace(); } return ResponseEntity.ok(data); } ``` 在上述代码中,使用List<Map<String, Object>>类型保存解析结果。对于每一行数据,使用Map<String, Object>类型保存列名和列值的对应关系。最后,将解析结果以JSON格式返回给前端。 以上就是Vue+Java解析Excel文件的基本步骤。需要注意的是,解析Excel文件需要考虑到文件格式、数据校验、异常处理等问题,具体实现需要根据实际情况进行调整。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值