调用DeepSeek API 增强版纯前端实现方案,支持文件上传和内容解析功能

以下是一个增强版纯前端实现方案,支持文件上传和内容解析功能,直接调用DeepSeek API:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>DeepSeek 智能助手 (支持附件)</title><style>:root {--primary-color: #2c3e50;--accent-color: #3498db;--error-color: #e74c3c;}body {font-family: 'Segoe UI', system-ui, sans-serif;max-width: 800px;margin: 2rem auto;padding: 0 20px;background: #f8f9fa;}.container {background: white;border-radius: 12px;box-shadow: 0 4px 6px rgba(0,0,0,0.1);padding: 2rem;}.input-group {display: flex;gap: 10px;margin-bottom: 1rem;}input[type="text"], input[type="file"] {flex: 1;padding: 12px;border: 2px solid #ddd;border-radius: 8px;font-size: 16px;}button {padding: 12px 24px;background: var(--accent-color);color: white;border: none;border-radius: 8px;cursor: pointer;transition: opacity 0.3s;}button:hover {opacity: 0.9;}#file-list {margin: 1rem 0;padding: 0;list-style: none;}.file-item {display: flex;align-items: center;padding: 8px;background: #f8f9fa;border-radius: 6px;margin-bottom: 6px;}.file-item span {flex: 1;font-size: 0.9em;}#response {margin-top: 20px;padding: 16px;background: #f8f9fa;border-radius: 8px;min-height: 100px;white-space: pre-wrap;line-height: 1.6;}.loading {display: none;color: #666;font-style: italic;}.error {color: var(--error-color);margin: 0.5rem 0;}</style>
</head>
<body><div class="container"><h1 style="color: var(--primary-color); margin-bottom: 1.5rem;">DeepSeek 智能助手</h1><!-- 文件上传区域 --><div class="input-group"><input type="file" id="file-input" multiple accept=".txt,.pdf,.docx"><button onclick="handleFileUpload()">上传文件</button></div><ul id="file-list"></ul><!-- 问答区域 --><div class="input-group"><input type="text" id="question" placeholder="请输入您的问题..."><button onclick="askQuestion()">发送</button></div><div class="loading" id="loading">处理中...</div><div id="response"></div></div><script>// 配置参数(⚠️ 安全提示:前端暴露API密钥仅限本地测试)const CONFIG = {API_KEY: 'your-api-key-here',API_URL: 'https://api.deepseek.com/v1/chat/completions',MODEL: 'deepseek-chat',MAX_FILE_SIZE: 2 * 1024 * 1024, // 2MBALLOWED_TYPES: ['text/plain', 'application/pdf', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document']}let uploadedFiles = [];// 文件上传处理async function handleFileUpload() {const fileInput = document.getElementById('file-input');const files = Array.from(fileInput.files);const fileList = document.getElementById('file-list');try {for (const file of files) {// 验证文件if (file.size > CONFIG.MAX_FILE_SIZE) {throw new Error(`文件 ${file.name} 超过大小限制 (最大 ${CONFIG.MAX_FILE_SIZE/1024/1024}MB)`);}if (!CONFIG.ALLOWED_TYPES.includes(file.type)) {throw new Error(`不支持的文件类型: ${file.type}`);}// 读取文件内容const content = await readFileContent(file);// 存储文件信息uploadedFiles.push({name: file.name,type: file.type,size: file.size,content: content,uploadedAt: new Date().toISOString()});// 更新文件列表const li = document.createElement('li');li.className = 'file-item';li.innerHTML = `<span>${file.name} (${formatFileSize(file.size)})</span><button onclick="removeFile('${file.name}')">删除</button>`;fileList.appendChild(li);}fileInput.value = ''; // 清空选择} catch (error) {showError(error.message);}}// 文件内容读取function readFileContent(file) {return new Promise((resolve, reject) => {const reader = new FileReader();reader.onload = () => resolve(reader.result);reader.onerror = reject;if (file.type === 'application/pdf') {// PDF处理需要第三方库(此处简化处理)reader.readAsArrayBuffer(file);} else {reader.readAsText(file, 'UTF-8');}});}// 提问处理async function askQuestion() {const question = document.getElementById('question').value.trim();const loading = document.getElementById('loading');const responseDiv = document.getElementById('response');if (!question) {showError('请输入有效问题');return;}try {loading.style.display = 'block';responseDiv.textContent = '';// 构建上下文const context = uploadedFiles.length > 0 ? `参考文件内容:\n${uploadedFiles.map(f => f.content).join('\n')}\n\n问题:`: '';// API请求const response = await fetch(CONFIG.API_URL, {method: 'POST',headers: {'Content-Type': 'application/json','Authorization': `Bearer ${CONFIG.API_KEY}`},body: JSON.stringify({model: CONFIG.MODEL,messages: [{role: "user",content: context + question}]})});if (!response.ok) throw new Error(`API请求失败: ${response.status}`);const data = await response.json();responseDiv.textContent = data.choices[0].message.content;} catch (error) {showError(error.message);console.error(error);} finally {loading.style.display = 'none';}}// 辅助函数function formatFileSize(bytes) {if (bytes < 1024) return bytes + ' B';if (bytes < 1048576) return (bytes/1024).toFixed(1) + ' KB';return (bytes/1048576).toFixed(1) + ' MB';}function removeFile(filename) {uploadedFiles = uploadedFiles.filter(f => f.name !== filename);document.querySelectorAll('.file-item').forEach(li => {if (li.textContent.includes(filename)) li.remove();});}function showError(message) {const errorDiv = document.createElement('div');errorDiv.className = 'error';errorDiv.textContent = message;document.body.appendChild(errorDiv);setTimeout(() => errorDiv.remove(), 3000);}// 事件监听document.getElementById('question').addEventListener('keypress', e => {if (e.key === 'Enter') askQuestion();});</script>
</body>
</html>

功能亮点

  1. 文件上传管理

    • 支持多文件上传 (PDF/DOCX/TXT)
    • 实时显示文件列表
    • 文件大小和类型验证
    • 单个文件删除功能
  2. 内容处理

    • 自动将文件内容作为上下文附加到问题
    • 基础PDF/DOCX文件处理(需扩展解析逻辑)
  3. 安全控制

    • 文件大小限制 (2MB)
    • 允许的文件类型白名单

使用说明

  1. 保存为 .html 文件
  2. 替换API密钥
  3. 通过以下方式访问:
    # 使用Python启动简易服务器
    python3 -m http.server 8000
    
    访问 http://localhost:8000

扩展建议

  1. 增强文件解析(需引入库):
<!-- 在<head>添加 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.4.120/pdf.min.js"></script>
<script src="https://unpkg.com/mammoth@1.4.8/mammoth.browser.min.js"></script><script>
// 修改readFileContent函数
async function readFileContent(file) {if (file.type === 'application/pdf') {const arrayBuffer = await file.arrayBuffer();const pdf = await pdfjsLib.getDocument(arrayBuffer).promise;let text = '';for (let i = 1; i <= pdf.numPages; i++) {const page = await pdf.getPage(i);const content = await page.getTextContent();text += content.items.map(item => item.str).join(' ');}return text;} else if (file.type === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document') {const arrayBuffer = await file.arrayBuffer();const result = await mammoth.extractRawText({arrayBuffer});return result.value;}return await file.text();
}
</script>
  1. 添加预览功能
function previewFile(filename) {const file = uploadedFiles.find(f => f.name === filename);if (file) {const win = window.open();win.document.write(`<pre>${file.content}</pre>`);}
}
  1. 添加会话管理
// 在CONFIG中添加
SESSION_MAX_AGE: 3600 // 1小时有效期// 初始化时读取本地存储
if (localStorage.getItem('chatSession')) {const session = JSON.parse(localStorage.getItem('chatSession'));if (Date.now() - session.timestamp < CONFIG.SESSION_MAX_AGE * 1000) {uploadedFiles = session.files;// 更新文件列表显示...}
}// 定期保存
setInterval(() => {localStorage.setItem('chatSession', JSON.stringify({files: uploadedFiles,timestamp: Date.now()}));
}, 30000);

注意事项

  1. 前端文件处理能力有限,大文件可能影响性能
  2. 复杂文档解析建议在服务端进行
  3. API密钥需通过后端服务保护(正式环境)
  4. 浏览器内存限制:建议添加文件数量限制

项目下载地址:
调用DeepSeek API 增强版纯前端实现方案,支持文件上传和内容解析功能

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[实现Rpc] 客户端 | Requestor | RpcCaller的设计实现

目录 Requestor类的实现 框架 完善 onResponse处理回复 完整代码 RpcCaller类的实现 1. 同步调用 call 2. 异步调用 call 3. 回调调用 call Requestor类的实现 &#xff08;1&#xff09;主要功能&#xff1a; 客户端发送请求的功能&#xff0c;进行请求描述对服务器…

WPS计算机二级•文档的页面设置与打印

听说这是目录哦 纸张大小页边距和装订线❤️‍&#x1f525;打印界面讲解❤️缩印&#x1f495;打印作文稿纸&#x1f49e;将文档打印成书籍&#x1f493;限制编辑设置&#x1f497;给文字文档加密&#x1f496;文档导出为 PDF格式&#x1f498;协作编辑模式&#x1f49d;能量站…

hackmyvm-buster

题目地址 信息收集 主机发现 ┌──(root㉿kali)-[/home/kali] └─# arp-scan -I eth1 192.168.56.0/24 Interface: eth1, type: EN10MB, MAC: 00:0c:29:34:da:f5, IPv4: 192.168.56.103 WARNING: Cannot open MAC/Vendor file ieee-oui.txt: Permission denied WARNING: C…

【入门音视频】音视频基础知识

&#x1f308;前言&#x1f308; 这个系列在我学习过程中&#xff0c;对音视频知识归纳总结的笔记。因为音视频相关讲解非常稀少&#xff0c;所以我希望通过这个音视频系列&#xff0c;跟大家一起学习音视频&#xff0c;希望减少初学者在学习上的压力。同时希望也欢迎指出文章的…

将Ubuntu操作系统的安装源设置为阿里云

在使用Ubuntu操作系统时,默认的软件源通常是国外的仓库,这可能会导致软件安装和更新速度较慢。为了提高下载速度和稳定性,我们可以将Ubuntu的安装源设置为阿里云镜像源。以下是详细步骤: 一、准备工作 在开始之前,请确保您的Ubuntu系统可以正常上网,并且您拥有管理员权…

基于 Python 的项目管理系统开发

基于 Python 的项目管理系统开发 一、引言 在当今快节奏的工作环境中&#xff0c;有效的项目管理对于项目的成功至关重要。借助信息技术手段开发项目管理系统&#xff0c;能够显著提升项目管理的效率和质量。Python 作为一种功能强大、易于学习且具有丰富库支持的编程语言&…

LabVIEW C编译支持工具库CCompileSupp.llb

路径&#xff1a;C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform\CCompileSupp.llb ​ 1. 工具库概述 定位&#xff1a;LabVIEW内置的C语言编译支持工具库&#xff0c;用于处理LabVIEW与C/C代码的混合编程接口&#xff0c;涵盖编译器配置、代码生成…

JVM之JVM的组成

Java 虚拟机&#xff08;JVM&#xff09;是 Java 程序的运行核心&#xff0c;它主要由类加载系统、运行时数据区、执行引擎和本地方法接口这几个关键部分组成。 类加载系统&#xff08;Class Loading System&#xff09; 类加载系统负责在程序运行时动态地将 Java 类加载到 J…

pycharm 调试 debug 进入 remote_sources

解决办法1&#xff1a; pycharm函数跳转到remote_sources中的文件中_pycharm修改remotesource包存放地址-CSDN博客 file->settings->project structure将项目文件夹设为"Sources"&#xff08;此时文件夹会变为蓝色&#xff09;。 解决方法2 Debug:使用Pychar…

iOS App的启动与优化

App的启动流程 App启动分为冷启动和热启动 冷启动&#xff1a;从0开始启动App热启动&#xff1a;App已经在内存中&#xff0c;但是后台还挂着&#xff0c;再次点击图标启动App。 一般对App启动的优化都是针对冷启动。 App冷启动可分为三个阶段&#xff1a; dyld&#xff1a…

StarRocks FE leader节点CPU使用率周期性的忽高忽低问题分析

背景 本文基于 StarRocks 3.3.5 最近在做一些 StarRocks 相关的指标监控的时候&#xff0c;看到了FE master的CPU使用率相对其他FE节点是比较高的&#xff0c;且 呈现周期性的变化&#xff08;周期为8分钟&#xff09;&#xff0c; 于此同时FE master节点的GC频率相对于其他节…

Spring高级篇-Spring IOC容器 Aware 接口

一、概述 在Spring框架中&#xff0c;IOC&#xff08;Inversion of Control&#xff09;容器负责管理应用程序中的对象&#xff08;即Bean&#xff09;的生命周期和依赖关系。Spring提供了一系列的Aware接口&#xff0c;允许Bean在初始化时获取Spring容器中的某些资源或信息。…

数字信任的底层逻辑:密码学核心技术与现实应用

安全和密码学 --The Missing Semester of Your CS Education 目录 熵与密码强度密码散列函数密钥体系 3.1 对称加密 3.2 非对称加密信任模型对比典型应用案例安全实践建议扩展练习杂项 密码学是构建数字信任的基石。 本文浅析密码学在现实工具中的应用&#xff0c;涵盖 1&…

MySQL数据库连接池泄露导致MySQL Server超时关闭连接

前言 最近做项目&#xff0c;发现老项目出现xxx&#xff0c;这个错误其实很简单&#xff0c;出现在MySQL数据库Server端对长时间没有使用的client连接执行清楚处理&#xff0c;因为是druid数据库&#xff0c;且在github也出现这样的issue&#xff1a;The last packet successf…

DirectX12(D3D12)基础教程三 线性代数与3D世界空间

线性代数是数学的一个分支&#xff0c;它的研究对象是向量&#xff0c;向量空间&#xff08;或称线性空间&#xff09;&#xff0c;线性变换和有限维的线性方程组。 向量和矩阵是学习3D入门最基本的理论基础。本章重点讲向量和矩阵. 向量概念 向量最基本的定义就是一个方向和…

LeetCode 230.二叉搜索树中第K小的元素

题目&#xff1a;给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 小的元素&#xff08;从 1 开始计数&#xff09;。 思路&#xff1a; 代码&#xff1a; /*** Definition for a binary tree node.* public class Tre…

Android 老项目 jcenter 库失效

最近重新维护了一些老项目发现大部分jcenter库失效了&#xff0c; Could not resolve com.xx:2.1.3. 如果你也遇到了&#xff0c;不妨试试 替换为 aliyun的jcenter服务&#xff0c;就不用一个个找代替库了。 project 下的 build.gradle 文件添加&#xff1a; maven { url htt…

Python数据结构:哈希表-高效存储与查找的秘密武器!

大家周一好&#xff01;今天我们来聊聊Python中一个非常重要的数据结构——哈希表。无论是算法面试还是实际开发&#xff0c;哈希表都扮演着至关重要的角色。掌握它&#xff0c;你就能轻松解决许多复杂的编程问题&#xff01; 在编程中&#xff0c;如何实现快速的存储与查找操…

【复习】Redis

数据结构 Redis常见的数据结构 String&#xff1a;缓存对象Hash&#xff1a;缓存对象、购物车List&#xff1a;消息队列Set&#xff1a;点赞、共同关注ZSet&#xff1a;排序 Zset底层&#xff1f; Zset底层的数据结构是由压缩链表或跳表实现的 如果有序集合的元素 < 12…

【电机控制器】ESP32-C3语言模型——DeepSeek

【电机控制器】ESP32-C3语言模型——DeepSeek 文章目录 [TOC](文章目录) 前言一、简介二、代码三、实验结果四、参考资料总结 前言 使用工具&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、简介 二、代码 #include <Arduino.h&g…