实际开发中,常见pdf|word|excel等文件的预览和下载

news2025/1/8 18:21:50

实际开发中,常见pdf|word|excel等文件的预览和下载

    • 背景
    • 相关类型数据之间的转换
      • 1、File转Blob
      • 2、File转ArrayBuffer
      • 3、Blob转ArrayBuffer
      • 4、Blob转File
      • 5、ArrayBuffer转Blob
      • 6、ArrayBuffer转File
    • 根据Blob/File类型生成可预览的Base64地址
    • 基于Blob类型的各种文件的下载
    • 各种类型文件的预览及其效果
      • 1、当前使用的node版本
      • 2、 业务场景
      • 3、图片类型预览
        • 3.1、安装依赖
        • 3.2、ImagePreview.vue
        • 3.3、效果
      • 4、Excel文件的预览
        • 4.1、依赖安装
        • 4.2、ExcelPreview.vue
        • 4.3、预览效果
      • 5、word文件的预览
        • 5.1、依赖安装
        • 5.2、WordPreview.vue
        • 5.3、预览效果
      • 6、pdf文件的预览
        • 6.1、依赖安装
        • 6.2、PdfPreview.vue
        • 6.3、预览效果
      • 7、json/xml文件的预览
        • 7.1、依赖安装
        • 7.2、全局引入
        • 7.3、JsonViewer组件的使用
        • 7.4、预览效果
      • 8、bim文件的预览
        • 8.1、依赖安装
        • 8.2、GeoBimPreview.vue
        • 8.3、预览效果

背景

实际开发中,大部分文件的预览会以流的方式传输,前端通过Element等UI库提供的上传组件传给后端File类型数据, 后端返回给前端Blob/ArrayBuffer类型数据 , 前端最终借助各种第三方工具或者自定义tool方法, 实现各种类型文件的下载或者预览. 少部分的会以文件地址的方式进行传输, 那么我们直接访问那个文件url即可.

相关类型数据之间的转换

1、File转Blob

export function fileToBlob(file: File) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = () => {
      const arrayBuffer: any = reader.result;
      const blob = new Blob([arrayBuffer], { type: file.type });
      resolve(blob);
    };
    reader.onerror = reject;
    reader.readAsArrayBuffer(file);
  });
}

在这里插入图片描述

2、File转ArrayBuffer

export function fileToArrayBuffer(file: File) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = () => {
      const arrayBuffer: any = reader.result;
      resolve(arrayBuffer);
    };
    reader.onerror = reject;
    reader.readAsArrayBuffer(file);
  });
}

3、Blob转ArrayBuffer

export function blobToArrayBuffer(blob) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = () => resolve(reader.result);
    reader.onerror = reject;
    reader.readAsArrayBuffer(blob);
  });
}

4、Blob转File

export function blobToFile(blob, fileName, fileType) {
  return new File([blob], fileName, { type: fileType })
}

5、ArrayBuffer转Blob

export function arrayBufferToBlob(arrayBuffer, blobType = 'application/octet-stream') {
	const blob = new Blob([arrayBuffer], { type: blobType  });
  	return blob;
}

6、ArrayBuffer转File

export function arrayBufferToFile(arrayBuffer, fileName, fileType = 'text/plain') {
	const file= new File([arrayBuffer], fileName, { type: fileType  });
  	return file;
}

根据Blob/File类型生成可预览的Base64地址

有些第三方预览工具不识别Blob/File, 如viewerjsv-viewer 预览图片的时候,是需要图片对应的src的,而不是Blob/File

export function createUrlByBlobOrFile(data: any) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = () => {
      resolve(reader.result);
    };
    reader.onerror = reject;
    reader.readAsDataURL(data);
  });
}

基于Blob类型的各种文件的下载

下载的文件响应类型可打印FIle/Blob对象查看,可执行:downloadFileUtil(fileBlob, fileBlob.type, fileBlob.fileName)

export function downloadFileUtil(data: Blob, responseType: string, fileName: any = new Date().valueOf()) {
	  const blob = new Blob([data], { type: responseType });
	  // 创建一个<a></a>标签
	  let a: HTMLAnchorElement | null = document.createElement('a');
	  const blobUrl = window.URL.createObjectURL(blob);
	  a.href = blobUrl;
	  a.download = fileName;
	  a.style.display = 'none';
	  document.body.appendChild(a);
	  a.click();
	  a.remove();
	  // 释放createObjectURL创建的资源
	  window.URL.revokeObjectURL(blobUrl);
}

各种类型文件的预览及其效果

个别预览的第三方插件库,需要使用特定的某些版本,当前指定的版本库都是可用的。

1、当前使用的node版本

在这里插入图片描述

2、 业务场景

  • 用户通过上传组件上传附件

用户从本地上传的附件拿到的类型是File, 保存之后, 拿到的就是文件列表项对应的Blob类型。
在这里插入图片描述

3、图片类型预览

图片类型预览使用的是v-viewerviewerjs, 可支持的预览图片类型有:jpg, jpeg, png, gif

3.1、安装依赖
yarn add v-viewer@^3.0.21 viewerjs@^1.11.7
3.2、ImagePreview.vue

v-viewerviewerjs 可以通过指令、组件和api三种方式实现预览。 实际开发中,基本上都是使用的是Blob类型,Blob类型转换为Base64地址后, 是不能通过import { api as viewerApi } from 'v-viewer';的方式预览的,尽管api的方式很简单,但它貌似只是支持本地文件URL/服务器文件URL。

通过使用viewer组件,借助img标签可以识别Base64图片路径,从而通过点击img列表,实现图片预览

<template>
  <div class="image-preview">
    <viewer :images="props.images" class="v-viewer">
      <img
        v-for="(imgItem, index) in props.images"
        :key="index"
        class="view-img-item"
        :src="imgItem.url"
        :alt="imgItem.name"
        :title="imgItem.name"
      />
    </viewer>
    <div class="auto-close-preview-com">
      <Close class="close-icon" @click="closeImgPreviewFn" />
    </div>
  </div>
</template>

<script lang="ts" setup>
import 'viewerjs/dist/viewer.css';
import { component as Viewer } from 'v-viewer';
import { onMounted } from 'vue';
import { ElMessage } from 'element-plus';


const props = defineProps({
  images: {
    type: Array as any,  // images存储的是Blob转成Base64的数组,类型转换上文createUrlByBlobOrFile可实现
    default: () => [],
  },
});
const emits = defineEmits(['closeImgPreview']);

function closeImgPreviewFn() {
  emits('closeImgPreview');
}
onMounted(() => {
  ElMessage.info('点击图片列表可预览~');
});
</script>

<style lang="css" scoped>
.image-preview {
  position: fixed;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
  z-index: 9998;
  background-color: rgb(0 0 0 / 70%);
  .v-viewer {
    width: 100%;
    height: 100%;
    .view-img-item {
      width: 250px;
      height: 250px;
      margin-right: 20px;
    }
  }
  .auto-close-preview-com {
    position: absolute;
    -webkit-app-region: no-drag;
    background-color: rgb(0 0 0 / 50%);
    border-radius: 50%;
    cursor: pointer;
    height: 80px;
    overflow: hidden;
    right: -40px;
    top: -40px;
    transition: background-color 0.15s;
    width: 80px;
    color: #ffffff;
    .close-icon {
      bottom: 15px;
      left: 15px;
      position: absolute;
      background-position: -260px 0;
      font-size: 0;
      height: 20px;
      line-height: 0;
      width: 20px;
    }
  }
}
</style>
3.3、效果

在这里插入图片描述

4、Excel文件的预览

Excel文件预览使用的是xlsx 插件库, 可支持类型有:xls, xlsx

4.1、依赖安装
yarn add xlsx@^0.18.5
4.2、ExcelPreview.vue
<template>
  <div class="xlsx-preview-box"></div>
</template>

<script lang="ts" setup>
import { onMounted } from 'vue';
// XLSX: 无法预览docx文件, 预览pdf也会乱码  只能预览xlsx文件
import * as XLSX from 'xlsx';

const props = defineProps({
  fileBlob: {
    type: Blob,
    default: () => null,
  },
});

onMounted(() => {
  if (props.fileBlob) {
    const reader = new FileReader();
    // 通过readAsArrayBuffer将blob转换为ArrayBuffer
    reader.readAsArrayBuffer(props.fileBlob);
    reader.onload = (event: any) => {
      // 读取ArrayBuffer数据变成Uint8Array
      const data = new Uint8Array(event.target.result);
      // 这里的data里面的类型和后面的type类型要对应
      const workbook = XLSX.read(data, { type: 'array' });
      const sheetNames = workbook.SheetNames; // 工作表名称
      const worksheet = workbook.Sheets[sheetNames[0]];
      const html = XLSX.utils.sheet_to_html(worksheet);
      document.getElementsByClassName('xlsx-preview-box')[0].innerHTML = html;
    };
  }
});
</script>

<style lang="css">
.xlsx-preview-box {
  width: 100%;
  height: 100%;
  overflow: auto;
  table {
    width: 100%;
    border-spacing: 0;
    tr {
      height: 40px;
      font-size: 14px;
      color: #666666;
      line-height: 14px;
      font-weight: 400;
    }
    tr:first-child {
      background-color: #ececec !important;
      height: 60px;
      font-size: 16px;
      color: #666666;
      font-weight: 700;
    }
    td {
      min-width: 80px;
      text-align: center;
      border: 1px solid #cccccc;
    }
    tr:nth-child(2n) {
      background-color: #fafafa;
    }

    tr:nth-child(2n + 1) {
      background-color: #ffffff;
    }
  }
}
</style>
4.3、预览效果

在这里插入图片描述

5、word文件的预览

word文件预览使用的是docx-preview 插件库, 可支持类型有:doc, docx

5.1、依赖安装
yarn add docx-preview@0.3.0

docx-preview 需要是0.3.0版本,最新的0.3.3版本会报docx-preview类型错误。且最新的版本解析的blob文件类型和0.3.0版本不一致,最新版本还会预览失败:报(Can’t find end of central directory : is this a zip file ? If it is, see)。

5.2、WordPreview.vue
<template>
  <div ref="wordPreviewRef" class="word-preview"></div>
</template>

<script lang="ts" setup>
import { ref, nextTick } from 'vue';
// docx-preview 需要是0.3.0版本,最新的0.3.3版本会报docx-preview类型错误
// 且最新的版本解析的blob类型和0.3.0版本不一致
// 最新版本还会预览失败:报(Can't find end of central directory : is this a zip file ? If it is, see)
import { renderAsync } from 'docx-preview';

const props = defineProps<{
  wordBlob: any;
}>();

const wordPreviewRef = ref({});

nextTick(() => {
  renderAsync(
    props.wordBlob, // blob 的type: application/vnd.openxmlformats-officedocument.wordprocessingml.document
    wordPreviewRef.value as HTMLElement, // HTMLElement 渲染文档内容的元素,
  );
});
</script>

<style lang="scss" scoped>
.word-preview {
  width: 100%;
  height: 100%;
  overflow: auto;
}
</style>
5.3、预览效果

在这里插入图片描述

6、pdf文件的预览

pdf文件预览使用的是pdfjs-dist 插件库, 可支持类型有:pdf

6.1、依赖安装
yarn add pdfjs-dist@2.16.105

pdfjs-dist 底层是pdfjs。不建议使用打包后的mjs类型的版本包。因为不支持线上环境对GlobalWorkerOptions.workerSrc的支持。具体的是:本地可以引入node_module路径,但是正式环境没这个路径;如果把对应的pdf.worker.min.mjs放到assets下,会报错:Failed to resolve module specifier '@/assets/pdfjs/pdf.worker.min.mjs; 如果放到public下,会报错Failed to load module script, public目录文件不会被编译,浏览器无法识别mjs文件

6.2、PdfPreview.vue
<template>
  <div class="pdf-preview">
    <!-- block: 避免一个视图显示多个canvas页 -->
    <canvas
      v-for="pageIndex in pdfPages"
      :id="`pdf-canvas-` + pageIndex"
      ref="pdfPreviewRef"
      :key="pageIndex"
      style="display: block"
    ></canvas>
  </div>
</template>

<script lang="ts" setup>
import { ref, onMounted, nextTick, reactive } from 'vue';

// import 'pdfjs-dist/web/pdf_viewer.css';
// 4.5.136版本
// import * as pdfjsLib from 'pdfjs-dist'; // /legacy/build/pdf.js
// import * as pdfjsViewer from 'pdfjs-dist/web/pdf_viewer.js';
import 'pdfjs-dist/web/pdf_viewer.css';
import * as pdfjsLib from 'pdfjs-dist';
import { blobToArrayBuffer } from '@/utils/tools';

const props = defineProps<{
  pdfBlob: any;
}>();

const pdfPreviewRef = ref({});
// pdf页数
const pdfPages = ref(0);
// pdf缩放比例
const pdfScale = ref(2.5); // 可以控制canvas的宽高
// pdf文档流,
// 这个不能使用ref,使用ref会报错: Cannot read from private field
let pdfDoc = reactive<any>({});

const renderPdf = (num) => {
  pdfDoc.getPage(num).then((page) => {
    const canvasId = `pdf-canvas-${num}`;
    const canvas: any = document.getElementById(canvasId);
    const ctx = canvas?.getContext('2d');
    const dpr = window.devicePixelRatio || 1;
    const bsr =
      ctx.webkitBackingStorePixelRatio ||
      ctx.mozBackingStorePixelRatio ||
      ctx.msBackingStorePixelRatio ||
      ctx.oBackingStorePixelRatio ||
      ctx.backingStorePixelRatio ||
      1;
    const ratio = dpr / bsr;
    const viewport = page.getViewport({ scale: pdfScale.value });
    canvas.width = viewport.width * ratio;
    canvas.height = viewport.height * ratio;
    canvas.style.width = `${viewport.width}px`;
    canvas.style.height = `${viewport.height}px`;
    ctx.setTransform(ratio, 0, 0, ratio, 0, 0);
    const renderContext = {
      canvasContext: ctx,
      viewport: viewport,
    };
    page.render(renderContext);
    if (num < pdfPages.value) {
      renderPdf(num + 1);
    }
  });
};

// 获取pdf文档流与pdf文件的页数
const loadFile = async () => {
  //  string | URL | TypedArray | ArrayBuffer | DocumentInitParameters
  const pdfArrayBuffer: any = await blobToArrayBuffer(props.pdfBlob);
  const loadingTask = pdfjsLib.getDocument(pdfArrayBuffer);
  loadingTask.promise.then((pdf) => {
    pdfDoc = pdf; // 获取pdf文档流
    pdfPages.value = pdf.numPages; // 获取pdf文件的页数
    nextTick(() => {
      renderPdf(1);
    });
  });
};

onMounted(async () => {
  // 正式环境找不到node_modules
  // pdfjsLib.GlobalWorkerOptions.workerSrc =
  //   '../../../node_modules/pdfjs-dist/build/pdf.worker.min.mjs';
  // 放在assets下: Failed to resolve module specifier '@/assets/pdfjs/pdf.worker.min.mjs
  // pdfjsLib.GlobalWorkerOptions.workerSrc = '@/assets/pdfjs/pdf.worker.min.mjs';
  // const baseurl = window.location.origin + window.location.pathname; // 本地路径
  // ${baseurl}pdfjs/pdf.worker.min.mjs 静态服务访问的返回的是流
  // pdfjsLib.GlobalWorkerOptions.workerSrc = `${baseurl}pdfjs/pdf.worker.min.mjs`; // Failed to load module script
  // public/pdfjs/pdf.worker.js: 将'../../../node_modules/pdfjs-dist/build/pdf.worker.js';复制到public目录下
  pdfjsLib.GlobalWorkerOptions.workerSrc = 'pdfjs/pdf.worker.js';  // “pdfjs/”不能写成“/pdfjs/”, 前者是相对路径, 后者是绝对路径(相对线上环境服务器)
  loadFile();
});
</script>
<style lang="scss" scoped>
.pdf-preview {
  width: 100%;
  height: 100%;
  overflow: auto;
}
</style>

6.3、预览效果

在这里插入图片描述

7、json/xml文件的预览

vue-json-viewer支持jsonxml文件的预览

7.1、依赖安装
yarn add vue-json-viewer@^3.0.4
7.2、全局引入

在这里插入图片描述

7.3、JsonViewer组件的使用

fileData存储的是后端接口返回的json字符串

<json-viewer v-else-if="preState.fileType === 'Json'" :value="preState.fileData" />
7.4、预览效果

在这里插入图片描述
在这里插入图片描述

8、bim文件的预览

geobim文件的预览使用的是@xbim/viewer插件库,当前使用的方式支持BlobUrl两种方式

8.1、依赖安装
yarn add @xbim/viewer@^2.1.0-pre202305041434
8.2、GeoBimPreview.vue

该组件接收的是url, 但是loadGeoBim处理兼容了Blob

<template>
  <canvas id="bim-canvas" style="width: 100%; height: 100%"></canvas>
</template>

<script lang="ts" setup>
import { watch, nextTick } from 'vue';
import { Grid, NavigationCube, Viewer, ViewType } from '@xbim/viewer';

const props = defineProps({
  dwgUrl: {
    type: String,
    default: () => '',
  },
});
let viewer;
const setViewerOptions = () => {
  viewer.background = [26, 51, 76, 255];
  viewer.highlightingColour = [0, 0, 225, 200];
  viewer.brightness = -0.5;
  viewer.hoverPickColour = [0, 0, 225, 200];
};
const setViewerPlugin = () => {
  const cube = new NavigationCube();
  cube.ratio = 0.05;
  // eslint-disable-next-line no-multi-assign
  cube.passiveAlpha = cube.activeAlpha = 0.85;
  viewer.addPlugin(new Grid());
  viewer.addPlugin(cube);
};
const token = localStorage.getItem('TOKEN') as string;
const headers = {
  Authorization: `Bearer ${JSON.parse(token).access_token}`,
};
const loadGeoBim = (dwgUrl) => {
  const check = Viewer.check();
  if (check.noErrors) {
    nextTick(() => {
      viewer = new Viewer('bim-canvas');
      setViewerOptions();
      setViewerPlugin();
      viewer.on('loaded', function () {
        viewer.show(ViewType.DEFAULT, undefined, undefined, false);
        viewer.start();
      });
      // 前置管理、任务管理、数据管理里访问的数据是四库的后端接口返回的文件流,服务管理里访问的是可视化系统后台接口返回的文件地址
      // node_modules\.vite\deps\@xbim_viewer.js  修复bim的左右键
      fetch(dwgUrl, { headers })
        .then((responce) => responce.arrayBuffer())
        .then((arrayBuffer) => {
          const blob = new Blob([arrayBuffer], { type: 'application/octet-stream' });
          viewer.load(blob);
        })
        .catch((err) => {
          viewer.load(dwgUrl);
        });
    });
  }
};
watch(
  () => props.dwgUrl,
  (dwgUrl) => {
    loadGeoBim(dwgUrl);
  },
  {
    immediate: true,
    deep: true,
  },
);
</script>

8.3、预览效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2272762.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Opencv》基础操作详解(4)

接上篇&#xff1a;《Opencv》基础操作详解&#xff08;3&#xff09;-CSDN博客 目录 22、图像形态学操作 &#xff08;1&#xff09;、顶帽&#xff08;原图-开运算&#xff09; 公式&#xff1a; 应用场景&#xff1a; 代码示例&#xff1a; &#xff08;2&#xff09;…

大数据高级ACP学习笔记(2)

钻取&#xff1a;变换维度的层次&#xff0c;改变粒度的大小 星型模型 雪花模型 MaxCompute DataHub

尚硅谷· vue3+ts 知识点学习整理 |14h的课程(持续更ing)

vue3 主要内容 核心&#xff1a;ref、reactive、computed、watch、生命周期 常用&#xff1a;hooks、自定义ref、路由、pinia、miit 面试&#xff1a;组件通信、响应式相关api ----> 笔记&#xff1a;ts快速梳理&#xff1b;vue3快速上手.pdf 笔记及大纲 如下&#xff…

阻抗(Impedance)、容抗(Capacitive Reactance)、感抗(Inductive Reactance)

阻抗&#xff08;Impedance&#xff09;、容抗&#xff08;Capacitive Reactance&#xff09;、感抗&#xff08;Inductive Reactance&#xff09; 都是交流电路中描述电流和电压之间关系的参数&#xff0c;但它们的含义、单位和作用不同。下面是它们的定义和区别&#xff1a; …

在 SQL 中,区分 聚合列 和 非聚合列(nonaggregated column)

文章目录 1. 什么是聚合列&#xff1f;2. 什么是非聚合列&#xff1f;3. 在 GROUP BY 查询中的非聚合列问题示例解决方案 4. 为什么 only_full_group_by 要求非聚合列出现在 GROUP BY 中&#xff1f;5. 如何判断一个列是聚合列还是非聚合列&#xff1f;6. 总结 在 SQL 中&#…

B树与B+树:数据库索引的秘密武器

想象一下&#xff0c;你正在构建一个超级大的图书馆&#xff0c;里面摆满了各种各样的书籍。B树和B树就像是两种不同的图书分类和摆放方式&#xff0c;它们都能帮助你快速找到想要的书籍&#xff0c;但各有特点。 B树就像是一个传统的图书馆摆放方式&#xff1a; 1. 书籍摆放&…

回归预测 | MATLAB实现CNN-SVM多输入单输出回归预测

回归预测 | MATLAB实现CNN-SVM多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-SVM多输入单输出回归预测预测效果基本介绍模型架构程序设计参考资料 预测效果 基本介绍 CNN-SVM多输入单输出回归预测是一种结合卷积神经网络&#xff08;CNN&#xff09;和支持向量机&#…

Linux-Ubuntu之裸机驱动最后一弹PWM控制显示亮度

Linux-Ubuntu之裸机驱动最后一弹PWM控制显示亮度 一&#xff0c; PWM实现原理二&#xff0c;软件实现三&#xff0c;正点原子裸机开发总结 一&#xff0c; PWM实现原理 PWM和学习51时候基本上一致&#xff0c;控制频率&#xff08;周期&#xff09;和占空比&#xff0c;51实验…

自定义校验注解

已有的注解不能满足所有的校验需求,特殊的情况需要自定义校验(自定义校验注解) 1.自定义注解,并在注解上指定校验逻辑 Constraint(validatedBy StateValidation.class) // 指定校验逻辑 package com.example.demo.validation;import jakarta.validation.Constraint; import j…

分数阶傅里叶变换代码 MATLAB实现

function Faf myfrft(f, a) %分数阶傅里叶变换函数 %输入参数&#xff1a; %f&#xff1a;原始信号 %a&#xff1a;阶数 %输出结果&#xff1a; %原始信号的a阶傅里叶变换N length(f);%总采样点数 shft rem((0:N-1)fix(N/2),N)1;%此项等同于fftshift(1:N)&#xff0c;起到翻…

Ubuntu 20.04安装gcc

一、安装GCC 1.更新包列表 user596785154:~$ sudo apt update2.安装gcc user596785154:~$ sudo apt install gcc3.验证安装 user596785154:~$ gcc --version二 编译C文件 1.新建workspace文件夹 user596785154:~$ mkdir workspace2.进入workspace文件夹 user596785154:~…

小兔鲜儿:头部区域的logo,导航,搜索,购物车

头部&#xff1a;logo ,导航&#xff0c;搜索&#xff0c;购物车 头部总体布局: 设置好上下外边距以及总体高度&#xff0c; flex布局让总体一行排列 logo&#xff1a; logo考虑搜索引擎优化&#xff0c;所以要使用 h1中包裹 a 标签&#xff0c;a 里边写内容&#xff08;到时候…

Linux C编程——文件IO基础

文件IO基础 一、简单的文件 IO 示例二、文件描述符三、open 打开文件1. 函数原型2. 文件权限3. 宏定义文件权限4. 函数使用实例 四、write 写文件五、read 读文件六、close 关闭文件七、Iseek 绍 Linux 应用编程中最基础的知识&#xff0c;即文件 I/O&#xff08;Input、Outout…

论文解读 | NeurIPS'24 IRCAN:通过识别和重新加权上下文感知神经元来减轻大语言模型生成中的知识冲突...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 作者简介 史丹&#xff0c;天津大学博士生 内容简介 大语言模型&#xff08;LLM&#xff09;经过海量数据训练后编码了丰富的世界知识。最近的研究表明&#xff0c…

【51单片机零基础-chapter5:模块化编程】

模块化编程 将以往main中泛型的代码,放在与main平级的c文件中,在h中引用. 简化main函数 将原来main中的delay抽出 然后将delay放入单独c文件,并单独开一个delay头文件,里面放置函数的声明,相当于收纳delay的c文件里面写的函数的接口. 注意,单个c文件所有用到的变量需要在该文…

扩散模型论文概述(三):Stability AI系列工作【学习笔记】

视频链接&#xff1a;扩散模型论文概述&#xff08;三&#xff09;&#xff1a;Stability AI系列工作_哔哩哔哩_bilibili 本期视频讲的是Stability AI在图像生成的工作。 同样&#xff0c;第一张图片是神作&#xff0c;总结的太好了&#xff01; 介绍Stable Diffusion之前&…

数据库软考历年上午真题与答案解析(2018-2024)

本题考查计算机总线相关知识。 总线&#xff08;Bus&#xff09;是计算机各种功能部件之间传送信息的公共通信干线&#xff0c;它是由导线组成的传输线束。 根据总线连接设备范围的不同&#xff0c; 分为&#xff1a;1.片内总线&#xff1a;芯片内部的总线&#xff1b; 2.系统…

【three.js】模型-几何体Geometry,材质Material

模型 在现实开发中&#xff0c;有时除了需要用代码创建模型之外&#xff0c;多数场景需要加载设计师提供的使用设计软件导出的模型。此时就需要使用模型加载器去加载模型&#xff0c;不同格式的模型需要引入对应的模型加载器&#xff0c;虽然加载器不同&#xff0c;但是使用方式…

彻底学会Gradle插件版本和Gradle版本及对应关系

看完这篇&#xff0c;保你彻底学会Gradle插件版本和Gradle版本及对应关系&#xff0c;超详细超全的对应关系表 需要知道Gradle插件版本和Gradle版本的对应关系&#xff0c;其实就是需要知道Gradle插件版本对应所需的gradle最低版本&#xff0c;详细对应关系如下表格&#xff0…

预测facebook签到位置

1.11 案例2&#xff1a;预测facebook签到位置 学习目标 目标 通过Facebook位置预测案例熟练掌握第一章学习内容 1 项目描述 本次比赛的目的是预测一个人将要签到的地方。 为了本次比赛&#xff0c;Facebook创建了一个虚拟世界&#xff0c;其中包括10公里*10公里共100平方公里的…