上传(图片)文件的功能实现

      说句实话,现在的开发简单多了。因为有现成的第三方的上传文件的代码。如果放在我们以前做开发,上传文件的代码都得自己写。

那现在的程序员面对上传文件的功能到底写啥代码。

1)、对于前端人员:就是把后端的请求地址,请求方式,要传的文件对象(选择的文件)写好。

2)、对于后端人员:只需要把接收的文件做重命名,修改位置,图片地址保存的数据库,再把图片地址响应给前端就行。

你看看,是不是上传文件是怎么上传的核心部分我们根本不用去关注。

话不多说,上干货。

          本文后端使用nodeJS,第三方模块使用multer。再用了一点点jQuery。

示例:注册功能的上传头像。

1、前端选择文件并发送请求 -> 后端接收到文件本身 -> 保存到服务器(硬盘)上 --->对文件进行重命名,并加上扩展名,--->把路径响应给前端---->前端把路径放在img标签的src属性

2、注册时,把前端拿到图片路径要发给后端,后端保存到数据库中。

一、前端代码:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>注册页面</title>
</head><body><div><h1>注册页面</h1><img id="selectfile" src="./images/defaultHeader.png" style="width: 100px; height: 100px;"><input id="inputfile" type="file" style="display: none;"><p>手机号:*<input type="text" id="userphone"><span id="phoneMsg"></span></p><p>密码:<input type="text" id="userpass" placeholder="长度6-16位,由数字,字母,下划线"><span id="passMsg"></span></p><p>确认密码:<input type="password" id="userpass2"><span id="pass2Msg"></span></p><p><input type="button" value="注册" id="btnRegister"><span id="errMsg"></span></p></div>
</body></html>
<script src="./js/jquery.js"></script>
<script>let headerPath = "";window.onload = function () {// 点击图片,调用 input type=file 标签的click事件$("#selectfile").on("click", function () {document.getElementById("inputfile").click();//触发onclick事件。})// onChange事件:当选择的文件发生变化时触发document.getElementById("inputfile").onchange = function () {console.log("选择了新的文件");// 上传图片var formData = new FormData();// 通过formData定义参数格式。// formData.append("参数名",参数值)formData.append('photo', document.getElementById('inputfile').files[0]);// $.ajax() 是jQuery封装好的ajax函数。$.ajax({url: "/uploadajax",type: "post",data: formData,contentType: false,processData: false,success: function (res) {console.log("后端响应的内容",res);console.log("res.path",res.path);document.getElementById("selectfile").src=res.path;headerPath = res.path}});};// 注册按钮document.getElementById("btnRegister").onclick = register;function register() {//为了减少篇幅,省去了注册功能的代码    }}</script>

二、后端代码:

1、用express搭建项目(用express脚手架)

express -e 项目名

2、安装第三方模块:multer:

npm i multer@1.4.5-lts.1 --save

我用的版本:"multer": "^1.4.5-lts.1"

3、在app.js文件里。增加代码: 1)、引入模块:

let multer  = require('multer');

2)、实例化并安装中间件

//2 实例化  
let objMulter = multer({ dest: './public/upload' }); //dest: 指定 保存位置(存到服务器),这个根据实际情况可以修改。
​
//安装中间件, 
app.use(objMulter.any());  //允许上传什么类型文件,any 代表任何类型  

项目只有运行后,会自动在你的项目里,产生一个目录 public/upload,以后上传的文件都在此目录保存。

3)、写后端接口。

以我的项目为例。

3.1)、在routes下创建文件 uploadajax.js,写上如下代码:

var express = require("express");
const fs = require("fs");
var router = express.Router();
​
router.post("/", function (req, res, next) {// multer对req对象做了扩展,增加了files属性,files属性里保存着上传文件的相关信息。// 如下:// fieldname:表单的name,其实就前端的参数名。 console.log("req.files[0].fieldname", req.files[0].fieldname);// photo
​const fileObj = req.files[0];let filename = (new Date()).getTime();//时间戳,毫秒数。let newPath = fileObj.destination+'/header'+filename+".jpg";//1、重命名文件fs.renameSync(fileObj.path,newPath);//2、给前端响应图片存储的路径。前端放在img标签的src属性上,就可以显示图片了。res.json({code:"200",path:`./upload`+'/header'+filename+".jpg"});
});
​
module.exports = router;

3.2)、在app.js里,引入 uploadajax.js,并写上接口的地址。

var uploadajaxRouter = require("./routes/uploadajax");
​
​
………………
​
​
app.use("/uploadajax",uploadajaxRouter);
​

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

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

相关文章

阿基米德签证小程序管理系统功能清单

阿基米德签证小程序管理系统&#xff0c;底层架构采用当前国内最流行的php框架thinkphp8.0、采用广泛使用的MYSQL数据库&#xff0c;管理后台前后台分离&#xff0c;同时使用了当今最流行的基于VUE3和elementPlus前端框架&#xff0c;小程序采用了支持多端合一的UNI-APP开发&am…

Kernel 地图

前言 在 Linux Kernel 中&#xff0c;根据 Makefile 和 Kconfig&#xff0c;可以快速地了解一个小的内核子系统。所以我将这两个文件称之为 Kernel 地图。 Kernel 地图 基本上&#xff0c;Linux 内核中&#xff0c;每一个目录下面都有一个 Makefile 和一个 Kconfig 文件。这…

docker 安装达梦dm8 包含lincese

1.加载达梦数据库docker镜像 dm_v8.1.1.66_x86_rh7_64_ent.tar为申请的镜像文件。 docker load -i dm_v8.1.1.66_x86_rh7_64_ent.tar 查看镜像 docker images 创建达梦数据库容器 执行创建命令&#xff1a; docker run -d -p 30236:5236 --restartalways --name dm8_test…

Day11-Linux系统iNode及链接知识及企业按哪里精讲

Day11-Linux系统iNode及链接知识及企业按哪里精讲 1. 文件核心 属性知识1.1 什么是索引节点&#xff08;inode&#xff09;。1.2 索引节点作用1.3 inode是怎么产生的&#xff1f;1.4 inode的特点&#xff1f;1.5 Linux系统读取文件的原理1.6 企业生产案例&#xff1a;No space …

行人重识别综述

Deep Learning for Person Re-identification: A Survey and Outlook 论文地址https://arxiv.org/pdf/2001.04193 1. 摘要 we categorize it into the closed-world and open-world settings. closed-world&#xff1a;学术环境下 open-world &#xff1a;实际应用场景下 2…

Python系列(15)—— int类型转string类型

Python中的int类型转string类型 一、引言 在Python编程中&#xff0c;我们经常会遇到需要将整数&#xff08;int&#xff09;类型转换为字符串&#xff08;string&#xff09;类型的情况。例如&#xff0c;当我们需要将数字与文本结合时&#xff0c;或者当我们需要将数字写入…

【算法 - 动态规划】力扣 691. 贴纸拼词

上一篇文章中的两道较为简单的题目都是通过 暴力递归 逐步修改成为 动态规划 &#xff0c;并使用了严格的 dp表依赖 &#xff0c;相信小伙伴对此有了初步的认识。 本文我们来练习一道 LeetCode 中 Hard 级别&#xff0c;不使用严格的表依赖的题目。 力扣691. 贴纸拼词 我们有…

《数据结构与算法之美》读书笔记

《数据结构与算法之美》读书笔记 写在前面 这本书的大部分内容比较浅显&#xff0c;因此只挑DSAA课程上没有涉及或没有深入讨论的点总结 第二章 数组相关 提高传统数组插入/删除数据效率的方法&#xff1a; 如果插入的数据不要求有序&#xff0c;可以直接把某位的原数据替换…

儿时游戏“红色警戒”之“AI警戒”

一、红色警戒里“警戒”命令背后的算法原理是什么 在《红色警戒》系列即时战略游戏中&#xff0c;“警戒”命令背后的算法原理相对简单但又实用&#xff0c;其核心目标是让单位能够自动检测并反击一定范围内的敌方单位。虽然具体的实现细节未公开&#xff0c;但可以推测其基本…

Slack 给平台加入了 AI 驱动的搜索和总结功能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

有什么办法解决SQL注入问题

随着互联网的普及和数字化进程的加速&#xff0c;Web攻击已经成为网络安全领域的一大威胁。Web攻击不仅可能导致个人隐私泄露、财产损失&#xff0c;还可能对企业和国家的安全造成严重影响。下面德迅云安全就分享一种常见的web攻击方式-SQL注入&#xff0c;了解下什么是SQL注入…

final域的内存语义

目录 一、概述 二、final域的重排序规则 三、写final域的重排序规则 四、读final域的重排序规则 五、final域为引用类型 一、概述 与锁和volatile相比&#xff0c;对final域的读和写更像是普通的变量访问。下面将介绍final域的内存语义。 final比volatile的强度弱一些&…

代码随想录刷题第34天

第一题是柠檬水找零https://leetcode.cn/problems/lemonade-change/&#xff0c;感觉并没有特别靠近贪心算法&#xff0c;可供讨论的情况非常少&#xff0c;5元收下&#xff0c;10元返5元&#xff0c;20元返15元&#xff0c;对各种找零情况讨论一下即可。 class Solution { pu…

跟老吕学Python编程——目录(含全教程链接)

&#x1f610; &#xff01;&#xff01;&#xff01;记得先关注订阅本专栏【跟老吕学Python编程】&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;不然后续找不到了哦&#xff01;&#xff01;&#xff01; &#x1f610; 以下是老吕对本教程的目录内容梳理↓↓…

123.买卖股票的最佳时机II

123.买卖股票的最佳时机II 原题链接&#xff1a;完成情况&#xff1a;参考代码&#xff1a;_122买卖股票的最佳时机II_可以多次买入卖出01_122买卖股票的最佳时机II_可以多次买入卖出02_122买卖股票的最佳时机II_常规dp_122买卖股票的最佳时机II_一维dp_122买卖股票的最佳时机…

leetcode(动态规划)53.最大子数组和(C++详细解释)DAY12

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 提示 2.解答思…

判断素数(java)

法一&#xff1a; import java.util.Scanner;public class SuShu {public static void main(String[] args) {Scanner scan new Scanner(System.in);int number scan.nextInt();isPrime(number);}public static void isPrime(int number) {int count 0;for (int i 2; i &l…

【阅读笔记】红外探测器盲元国标标准及盲元识别

1、盲元定义 盲元的定义&#xff1a;盲元是红外焦平面探测器中响应过高或过低的探测单元&#xff0c;即无法准确成像的像元。盲元主要分为噪声盲元和响应率差异盲元两大类。 线阵红外探测器应用中&#xff0c;经常存在相邻的像元之间响应率有明显差异&#xff0c;其灰度响应输…

网络安全-一句话木马

声明 遵纪守法 请严格遵守网络安全法相关条例&#xff01; 此分享主要用于交流学习&#xff0c;请勿用于非法用途&#xff0c;一切后果自付。 一切未经授权的网络攻击均为违法行为&#xff0c;互联网非法外之地。 反制 大家在知道了常规一句话的木马之后&#xff0c;就可以通…

Allegro172版本如何用自带功能改变过孔网络属性操作指导

Allegro172版本如何用自带功能改变过孔网络属性操作指导 在用Allegro做PCB设计的时候,时常会需要将过孔的网络进行变更,可以将原来的过孔删除,再重新打一个,这种方法难免会繁琐一些。 当然我们可以借助skill工具来完成更换过孔网络的更改,除此之外,Allegro自带的功能完成…