当前位置: 首页 > news >正文

记录springboot+vue+fastdfs实现简易的文件(上传、下载、删除、预览)操作

前言说明:springboot + vue + FastDFS实现文件上传(支持预览)升级版

FASTDFS部分

FASTDFS安装过程:基于centos 7安装FastDFS文件服务器

SpringBoot部分

springboot源码实现

package com.core.doc.controller;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.core.doc.entity.FileInfo;
import com.core.doc.mapper.FileInfoMapper;
import com.core.doc.response.Result;
import com.core.doc.until.FastUtils;
//import org.openimaj.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;@RestController
@RequestMapping("/upload")
@CrossOrigin
public class UploadController {@AutowiredFileInfoMapper fileInfoMapper;/*** 文件上传**/@PostMapping("/import")public String importData(MultipartFile file, HttpServletRequest req) throws IOException {System.out.println("file = " + file);String name = file.getOriginalFilename();String realPath = req.getSession().getServletContext().getRealPath("/");System.out.println("realPath = " + realPath);String fileId = FastUtils.upload(file);
//        String url = "http://xx.xx.x.xx/" + fileId;String url =  fileId;System.out.println(url);return url;}/*** 文件下载**/@GetMapping("/downloadFile")public void downloadFile(HttpServletResponse response,String  filePath) throws UnsupportedEncodingException {
//        String filePath = "group1/M00/00/00/wKg4CmP7OiaAUzIvAADA8Mf85m8974.pdf";
//        String fileName = "xxx.pdf";
//        File file = new File(filePath);
//        if(file.exists()) {if(filePath == null)return;QueryWrapper<FileInfo> wrapper = new QueryWrapper<>();wrapper.eq("filePath",filePath);List<FileInfo> fileInfos = fileInfoMapper.selectList(wrapper);String filename = "未知文档.pdf";if(fileInfos != null && fileInfos.size() > 0 && fileInfos.get(0).getFilename() != null ){filename = fileInfos.get(0).getFilename() ;if(!fileInfos.get(0).getFilename().contains(".pdf")){filename = fileInfos.get(0).getFilename() +".pdf";}}response.setContentType("application/force-download;charset=UTF-8");response.setCharacterEncoding("UTF-8");response.addHeader("Content-Disposition", "attachment;fileName="  + new String(filename.getBytes("gb2312"), "ISO-8859-1"));byte[] bytes = FastUtils.testDownload(filePath);FileInputStream fis = null;System.out.println(filePath);OutputStream outputStream = null;int len = 0;try {outputStream = response.getOutputStream();System.out.println(bytes);if(bytes == null){return;}outputStream.write(bytes);outputStream.flush();} catch (Exception e) {e.printStackTrace();} finally {try {if (outputStream != null) {outputStream.close();}if (fis != null) {fis.close();}} catch (IOException e) {throw new RuntimeException(e);}}}/*** 文件删除**/@PostMapping("/del")@ResponseBodypublic Result delFile(@RequestParam String fileName) {int i = FastUtils.delFile(fileName);if(i != -1){return Result.ok().data("msg", "删除成功");} else {return Result.error().data("msg", "失败");}}@PostMapping("/downlaod")@ResponseBodypublic byte[] upload(HttpServletResponse response, @RequestParam String fileName) {byte[] bytes = FastUtils.testDownload(fileName);response.setContentType("application/octet-stream;charset=UTF-8");
// 设置返回的文件类型OutputStream toClient = null; // 得到向客户端输出二进制数据的对象try {response.setCharacterEncoding("UTF-8");//使用setHeader方法设置浏览器使用UTF-8进行解码response.setHeader("Content-Type", "text/html;charset=UTF-8");toClient = response.getOutputStream();toClient.write(bytes); // 输出数据toClient.close();} catch (IOException e) {e.printStackTrace();} finally {return bytes;}}private void genCode(HttpServletResponse response, byte[] data) throws IOException {response.reset();response.addHeader("Access-Control-Allow-Origin", "*");response.addHeader("Access-Control-Expose-Headers", "Content-Disposition");response.setHeader("Content-Disposition", "attachment; filename=\"declare.zip\"");response.addHeader("Content-Length", "" + data.length);response.setContentType("application/octet-stream; charset=UTF-8");
//        IOUtils.write(data, (DataOutput) response.getOutputStream());}}

FastUtils工具类

package com.core.doc.until;import org.csource.common.MyException;
import org.csource.fastdfs.*;
import org.junit.Test;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;/*** 文件上传工具类*/
public class FastUtils {private static StorageClient1 client1;static {try {ClientGlobal.initByProperties("fastdfs-client.properties");TrackerClient trackerClient = new TrackerClient();TrackerServer trackerServer = trackerClient.getConnection();client1 = new StorageClient1(trackerServer, null);} catch (IOException e) {e.printStackTrace();} catch (MyException e) {e.printStackTrace();}}public static int delFile(String filename) {int count = 0;try {count = client1.delete_file1(filename);} catch (IOException e) {e.printStackTrace();} catch (MyException e) {e.printStackTrace();}finally {return count;}}public static String upload(MultipartFile file) {String oldName = file.getOriginalFilename();try {return client1.upload_file1(file.getBytes(), oldName.substring(oldName.lastIndexOf(".") + 1), null);} catch (IOException e) {e.printStackTrace();} catch (MyException e) {e.printStackTrace();}return null;}public static byte[] download(String filepath, HttpServletResponse response) throws IOException {byte[] bytes = null;try {//1.初始化fastdfs客户端配置文件ClientGlobal.initByProperties("fastdfs-client.properties");// 加载properties配置文件System.out.println("network_timeout=" + ClientGlobal.g_network_timeout + "ms");//输出properties中配置的参数,检测properties文件是否生效System.out.println("charset=" + ClientGlobal.g_charset);// 2.获取trackerServerTrackerClient tracker = new TrackerClient();// 创建tracker客户端对象TrackerServer trackerServer = tracker.getConnection();//获得tracker连接对象//3.获取storageClient(通过trackerServer 和 storageServer:null)StorageServer storageServer = null;StorageClient1 client = new StorageClient1(trackerServer, storageServer);//通过tracker服务器返回storage服务器对象(客户端)String name = "wKg4CmP7btCAZpAmAADA8Mf85m8679.pdf";//4.下载操作//方式一 文件id下载bytes = client.download_file1("group1/M00/00/00/wKg4CmP7btCAZpAmAADA8Mf85m8679.pdf");//记得要传文件id返回字节流File file=new File("D:\\KM\\"+name);// 给定文件路径 和 名称FileOutputStream fileOutputStream=new FileOutputStream(file);//窗机输出流fileOutputStream.write(bytes);//写入数据fileOutputStream.close();//关闭输出流//方式二 组名+文件路径byte[] bytes2 = client.download_file("group1","/M00/00/00/"+name);//记得修改File file2=new File("D:\\KM\\1"+name);// 给定文件路径 和 名称FileOutputStream fileOutputStream2=new FileOutputStream(file2);//窗机输出流fileOutputStream2.write(bytes);//写入数据fileOutputStream2.close();//关闭输出流trackerServer.close();} catch (Exception ex) {ex.printStackTrace();}finally {return bytes;}}public static byte[] testDownload(String filename) {byte[] bytes = null;try {//1.初始化fastdfs客户端配置文件ClientGlobal.initByProperties("fastdfs-client.properties");// 加载properties配置文件System.out.println("network_timeout=" + ClientGlobal.g_network_timeout + "ms");//输出properties中配置的参数,检测properties文件是否生效System.out.println("charset=" + ClientGlobal.g_charset);// 2.获取trackerServerTrackerClient tracker = new TrackerClient();// 创建tracker客户端对象TrackerServer trackerServer = tracker.getConnection();//获得tracker连接对象//3.获取storageClient(通过trackerServer 和 storageServer:null)StorageServer storageServer = null;StorageClient1 client = new StorageClient1(trackerServer, storageServer);//通过tracker服务器返回storage服务器对象(客户端)String name = "wKg4CmP7btCAZpAmAADA8Mf85m8679.pdf";//4.下载操作//方式一 文件id下载bytes = client.download_file1(filename);//记得要传文件id返回字节流
//            File file=new File("D:\\KM\\"+name);// 给定文件路径 和 名称
//            FileOutputStream fileOutputStream=new FileOutputStream(file);//窗机输出流
//            fileOutputStream.write(bytes);//写入数据
//            fileOutputStream.close();//关闭输出流//方式二 组名+文件路径
//            byte[] bytes2 = client.download_file("group1","/M00/00/00/"+name);//记得修改
//            File file2=new File("D:\\KM\\1"+name);// 给定文件路径 和 名称
//            FileOutputStream fileOutputStream2=new FileOutputStream(file2);//窗机输出流
//            fileOutputStream2.write(bytes);//写入数据
//            fileOutputStream2.close();//关闭输出流trackerServer.close();} catch (Exception ex) {ex.printStackTrace();}finally {return bytes;}}}

Vue部分

vue预览功能参考:vue-pdf实现pdf文件在线预览

vue预览功能结合实现(以下代码为案例代码:核心代码)
一、本地测试环境,需要配置跨域
在vue.config.js中配置需要跨域的IP地址

 'pdf': {target: 'http://xxx.xxx.xx.x/',changOrigin: true,  pathRewrite: {'^/pdf': ''  } }

其中 pdfUrl 只需赋值 后缀即可如下所示

group1/M00/00/01/wKg4CmQVuuiAZRYnAALX0oge5B8291.pdf

在这里插入图片描述

 <el-dialog title="查看" :visible.sync="showVisible" :width="hxi+'%'"><div class="pdf" :visible.sync="showVisible"><div class="pdf-tab"><!-- <div class="btn-def"@click.stop="clock">顺时针</div><div class="btn-def"@click.stop="counterClock">逆时针</div> --></div><el-button type="success" :class="{select:idx==0}"@touchstart="idx=0"@touchend="idx=-1"@click="scaleD">放大</el-button><el-button type="success" :class="{select:idx==1}"@touchstart="idx=1"@touchend="idx=-1"@click="scaleX">缩小</el-button><!-- <div>进度:{{loadedRatio}}</div> --><!-- <div>页面加载成功: {{curPageNum}}</div> --><div class="main"><pdf ref="pdf":src="pdfUrl":page="pageNum":rotate="pageRotate"@password="password"@progress="loadedRatio = $event"@page-loaded="pageLoaded($event)"@num-pages="pageTotalNum=$event"@error="pdfError($event)"@link-clicked="page = $event"></pdf><div style="float:right">{{pageNum}}/{{pageTotalNum}}</div></div> <div><el-button class="btn-def btn-pre" type="success"@click.stop="prePage" style="mar">上一页</el-button><el-button class="btn-def btn-next" type="primary"`在这里插入代码片`@click.stop="nextPage">下一页 </el-button></div></div></el-dialog>

二、若是部署上线,无法预览需要配置nginx进行地址映射,比如部署的tomcat服务器地址为 8080端口,而安装的DFS服务器为80端口,那就将tomcat的8080端口,配置代理为

location /pdf/{proxy_pass   http://xxx.xxx.xx.xx:8080/;}

在这里插入图片描述

下载功能,目前实现就是结合后端,通过io流的形式,进行跳转下载
,vue处理代码如下:

 window.location.href = 'http://xxx.xxx.xx.xx:8082/upload/downloadFile?filePath='+this.FileData.filepath;

在这里插入图片描述

在这里插入图片描述
文件上传功能,结合 element ui
只需将action 改为自己的接口即可,springboot的源码在上面

<el-uploadclass="upload-demo"action="https://localhost:8082/upload/file":on-preview="handlePreview":on-remove="handleRemove":before-remove="beforeRemove"multiple:limit="3":on-exceed="handleExceed":file-list="fileList"><el-button size="small" type="primary">点击上传</el-button><div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
</el-upload>

相关文章:

记录springboot+vue+fastdfs实现简易的文件(上传、下载、删除、预览)操作

前言说明&#xff1a;springboot vue FastDFS实现文件上传&#xff08;支持预览&#xff09;升级版 FASTDFS部分 FASTDFS安装过程&#xff1a;基于centos 7安装FastDFS文件服务器 SpringBoot部分 springboot源码实现 package com.core.doc.controller;import com.baomid…...

Java中循环使用Stream应用场景

在JAVA中&#xff0c;涉及到对数组、Collection等集合类中的元素进行操作的时候&#xff0c;通常会通过循环的方式进行逐个处理&#xff0c;或者使用Stream的方式进行处理。例如&#xff0c;现在有这么一个需求&#xff1a;从给定句子中返回单词长度大于5的单词列表&#xff0c…...

中国蚁剑AntSword实战

中国蚁剑AntSword实战1.基本使用方法2.绕过安全狗连接3.请求包修改UA特征伪造RSA流量加密4.插件使用1.基本使用方法 打开蚂蚁宝剑&#xff0c;右键添加数据&#xff1a; 输入已经上传马的路径和连接密码&#xff1a; 测试连接&#xff0c;连接成功&#xff01; GetShell了&…...

C++ 直接初始化和拷贝初始化

首先我们介绍直接初始化&#xff1a;编译器使用普通的函数匹配来选择与我们提供的参数最匹配的构造函数。文字描述可能会让你们云里雾里&#xff0c;那我们直接看代码&#xff1a; //先设计这样的一个类 class A{ public:A(){ cout << "A()" << endl; }A…...

数据迁移工具

1.Kettle Kettle是一款国外开源的ETL工具,纯Java编写,绿色无需安装,数据抽取高效稳定 (数据迁移工具)。 Kettle 中有两种脚本文件,transformation 和 job,transformation 完成针对数据的基础转换,job 则完成整个工作流的控制。 Kettle 中文名称叫水壶,该项目的主程序…...

【C/C++】程序的内存开辟

在C/C语言中&#xff0c;不同的类型开辟的空间区域都是不一样的. 这节我们就简单了解下开辟不同的类型内存所存放的区域在哪里. 文章目录栈区&#xff08;stack&#xff09;堆区&#xff08;heap&#xff09;数据段&#xff08;静态区&#xff09;常量存储区内存开辟布局图栈区…...

全网最完整,接口测试总结彻底打通接口自动化大门,看这篇就够了......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 所谓接口&#xff0…...

28-flume和kafka为什么要结合使用

一&#xff1a;flume和kafka为什么要结合使用 首先&#xff1a;Flume 和 Kafka 都是用于处理大量数据的工具&#xff0c;但它们的设计目的不同。Flume 是一个可靠地收集、聚合和移动大量日志和事件数据的工具&#xff0c;而Kafka则是一个高吞吐量的分布式消息队列&#xff0c;…...

STM32外设-定时器详解

0. 概述 本文针对STM32F1系列&#xff0c;主要讲解了其中的8个定时器的原理和功能 1. 定时器分类 STM32F1 系列中&#xff0c;除了互联型的产品&#xff0c;共有 8 个定时器&#xff0c;分为基本定时器&#xff0c;通用定时器和高级定时器基本定时器 TIM6 和 TIM7 是一个 16 位…...

史上最详细的改良顺序表讲解,看完不会你打我

目录 0.什么是顺序表 1.顺序表里结构体的定义 2.顺序表的初始化 3.顺序表的输入 4.增加顺序表的长度 5.1顺序表的元素查找&#xff08;按位查找&#xff09; 5.2顺序表的元素查找&#xff08;按值查找&#xff09;在顺序表进行按值查找&#xff0c;大概只能通过遍历的方…...

【Unity入门】资源包导入和导出

【Unity入门】资源包导入和导出 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;1&#xff09;资源目录 Unity的资源&#xff08;模型&#xff0c;场景&#xff0c;脚本&#xff09;等都保存在Assert目录下&…...

python条件语句与循环语句

目录 一、条件语句 1.1if 二、循环语句 2.1while 2.2for循环 2.3break和continue 三、test和总结 一、条件语句 1.1if Python条件语句是通过一条或多条语句的执行结果&#xff08;True或者False&#xff09;来决定执行的代码块。 Python程序语言指定&#xff1a; 任…...

【leetcode】链表(2)

目录 1. 环形链表 解题思路 2. 环形链表 II 解题思路 3. 删除排序链表中的重复元素 解题思路 4. 删除排序链表中的重复元素 II 解题思路 5. 移除链表元素 解题思路 6. 链表的中间结点 解题思路 1. 环形链表 OJ&#xff1a;环形链表 给你一个链表的头节点 head &am…...

使用Vue+vue-router+路由守卫实现路由鉴权功能实战

目录 一、本节介绍和上节回顾 1. 上节介绍 2. Vue SpringBoot前后端分离项目实战的目录 3. 本小节介绍 二、Vue-router改造以及路由鉴权 1. 路由数据的拆分 2. 路由守卫 三、404错误页的实现 1. 创建全局css样式 2. 全局样式引入 3. 404页面的开发 4. el-button的…...

多线程(三):Thread 类的基本属性

上一个篇章浅浅了解了一下 线程的概念&#xff0c;进程与线程的区别&#xff0c;如何实现多线程编程。 而且上一章提到一个重要的面试点&#xff1a; start 方法和 run 方法的区别。 start 方法是从系统那里创建一个新的线程&#xff0c;这个线程会自动调用内部的run 方法&…...

蓝桥杯嵌入式第六课--串口收发

前言串口作为一个考试中考察频率较高的考点&#xff0c;其套路比较固定&#xff0c;因此值得我们仔细把握。本节课主要着眼于快速配置实现 串口收发与串口的中断。CubeMX配置选择串口2配置异步收发模式基本参数设置&#xff08;波特率、校验位等等&#xff09;开启串口收发中断…...

蓝桥杯冲刺 - Lastweek - 你离省一仅剩一步之遥!!!(掌握【DP】冲刺国赛)

文章目录&#x1f4ac;前言&#x1f3af;week3&#x1f332;day10-1背包完全背包多重背包多重背包 II分组背包&#x1f332;day2数字三角形 - 线性DP1015. 摘花生 - 数字三角形&#x1f332;day3最长上升子序列 - 线性DP1017. 怪盗基德的滑翔翼 - LIS1014.登山 - LIS最长公共子…...

C++ map与set的学习

1. 关联式容器在初阶阶段&#xff0c;我们已经接触过STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque、forward_list(C11)等&#xff0c;这些容器统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面存储的是元素本身。关联式容器也…...

【C语言初阶】函数

文章目录&#x1f490;专栏导读&#x1f490;文章导读&#x1f337;函数是什么&#xff1f;&#x1f337;函数的分类&#x1f33a;库函数&#x1f33a;自定义函数&#x1f337;函数的参数&#x1f337;函数的调用&#x1f337;函数的嵌套调用和链式访问&#x1f33a;嵌套调用&a…...

CentOS 7安装redis6.2.6(包括服务开机自启和开放端口)

CentOS 7安装redis6.2.61. 官网下载redis文件2. 校验安装依赖2.1 安装系统默认版本gcc2.2 升级gcc版本3. 解压编译安装4. 修改配置redis.conf4.2 设置密码4.3 绑定ip&#xff08;可选&#xff09;5. 启动redis服务并测试5.2 测试安装是否成功5.3 redis开机自启配置6.开放防火墙…...

基于注解的自动装配~

Autowired&#xff1a;实现自动装配功能的注解 Autowired注解能够标识的位置&#xff1a; 标识在成员变量上&#xff0c;此时不需要设置成员变量的set方法标识在成员变量对应的set方法上标识在为当前成员变量赋值的有参构造上使用注解进行自动装配&#xff0c;只要在其成员变量…...

【深度学习】【分布式训练】Collective通信操作及Pytorch示例

相关博客 【深度学习】【分布式训练】Collective通信操作及Pytorch示例 【自然语言处理】【大模型】大语言模型BLOOM推理工具测试 【自然语言处理】【大模型】GLM-130B&#xff1a;一个开源双语预训练语言模型 【自然语言处理】【大模型】用于大型Transformer的8-bit矩阵乘法介…...

Spring常用注解说明

目录 1.常用注解 2.特别说明 3.xml及注解方式 1.常用注解 (1) SpringBootApplication (2) ControllerRestControllerRequestMappingRequestParamPathVariableGetMappingPostMappingPutMappingDeleteMappingResponseBodyRequestBodyCrossOrigin (3) ConfigurationBeanServ…...

13-C++面向对象(纯虚函数(抽象类)、多继承、多继承-虚函数、菱形继承、虚继承、静态成员)

虚析构函数 存在父类指针指向子类对象的情况&#xff0c;应该将析构函数声明为虚函数&#xff08;虚析构函数&#xff09; 纯虚函数 纯虚函数&#xff1a;没有函数体且初始化为0的虚函数&#xff0c;用来定义接口规范 抽象类&#xff1a; 含有纯虚函数的类&#xff0c;不可以实…...

Android DataBinding 自定义View实现数据双向绑定

看不懂的可以先看看单向数据绑定&#xff1a;Android DataBinding数据变化时自动更新界面_皮皮高的博客-CSDN博客 然后再确定已经启动了dataBinding的情况下&#xff0c;按下面的顺序来&#xff1a; 首先创建一个自定义View&#xff1a; import android.content.Context imp…...

网络安全中的渗透测试主要那几个方面

渗透测试中主要有软件测试和渗透测试。 1、测试对象不同 软件测试&#xff1a;主要测试的是程序、数据、文档。 渗透测试&#xff1a;对象主要为网络设备、主机操作系统、数据库系统和应用系统。 2、测试内容不同 软件测试&#xff1a;主要工作内容是验证和确认&#xff0c;发…...

Cursor:GPT-4 驱动的强大代码编辑器

Cursor &#xff08;https://www.cursor.so/&#xff09;是 GPT-4 驱动的一款强大代码编辑器&#xff0c;可以辅助程序员进行日常的编码。下面通过一个实际的例子来展示 Cursor 如何帮助你编程。这个例子做的事情是网页抓取。抓取的目标是百度首页上的百度热搜&#xff0c;如下…...

C/C++中for语句循环用法及练习

目录 语法 下面是 for 循环的控制流&#xff1a; 实例 基于范围的for循环(C11) 随堂笔记&#xff01; C语言训练-计算1~N之间所有奇数之和 题目描述 输入格式 输出格式 样例输入 样例输出 环形方阵 干货直达 for 循环允许您编写一个执行特定次数的循环的重复控制结构。…...

AnimatorOverrideController说明

unity-AnimatorOverrideControllerhttps://docs.unity.cn/cn/current/ScriptReference/AnimatorOverrideController.html 用于控制动画器重写控制器的接口。 动画器重写控制器的用途是重写某个控制器的动画剪辑&#xff0c;从而为给定化身定制动画。 在运行时基于相同的 Anim…...

1.4、第三阶段 MySQL数据库

root数据库技术 一、数据库理论 1 什么是数据库技术 数据库技术主要研究如何组织、存储数据&#xff0c;并如何高效地提取和处理数据。 2 什么是SQL SQL&#xff08;Structured Query Language&#xff09;结构化查询语言 SQL是操作数据库的命令集&#xff0c;也是功能齐全的…...

网站建设申报书/中文域名查询官网

292. Nim 游戏 - 力扣&#xff08;LeetCode&#xff09; 剩下4块的时候&#xff0c;如果轮到你&#xff0c;那么你必输。 先简单推一下&#xff0c;如果第n块的时候轮到你&#xff1a; n 5 : 必胜&#xff08;拿1块&#xff09; n 6 : 必胜&#xff08;拿2块&#xff09; n…...

网页美工培训哪里好/深圳百度网站排名优化

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; 近日&#xff0c;据外媒报道&#xff0c;Chromium 团队成员兼高级 Chrome 工程师 Peter Kasting 表示&#xff0c;Windows 10 的 Chrome 浏览器的暗色模式正在开发中。一直以来&#xff0c;Chro…...

做网站主播要什么条件/小说搜索风云榜排名

苯四乙酸 cas1820793-31-4 齐岳中间体|单体材料 英文名称&#xff1a; NA 中文名称&#xff1a; 苯四乙酸 MF&#xff1a; C14H14O8 MW&#xff1a; 310.26 CAS&#xff1a; 1820793-31-4 氟代功能单体53 丙烯酸三氟乙酯 407-47-6 TFEA 58519-06-5 甲基丙烯酸2,2,2-三氟…...

国外化妆品网站模板/青岛seo网站推广

Oracle创建实例的最少参数需求我们知道,Oracle在启动过程中,需要读取参数文件(pfile/spfile)来创建实例.Oracle在启动过程中,寻找参数文件的顺序为:spfile.ora,spfile.ora,init.ora.而创建实例的过程中,Oracle需要的最少参数为一个,即db_name参数.我们来看一个测试,启动一个任意…...

wdcp v3搭建WordPress/seo诊断优化方案

【摘要】最近两个月都在学习 Linux 驱动&#xff0c;中间碰到了很多问题&#xff0c;进度比较缓慢。尽管不是班科出生的&#xff0c;但是还是觉得算法很有必要学一学。因此将数组元素查找作为自己算法开篇的第一篇博客&#xff0c;好好跟着平凡程序员的博客学习&#xff0c;内容…...

企业服务网/vue seo优化

课前作业如果你对 promise 、reflux 还不那么熟悉&#xff0c;请先行了解他们是什么&#xff0c;有什么用。ReFlux细说大白话讲解Promise现状分析首先我们来絮叨絮叨后端同学是怎么写代码的。首先絮叨一下经典问题&#xff0c;MVC用户看到viewview ——————————》 cont…...