摘要:原文首發(fā)博主經(jīng)過(guò)實(shí)踐,這里給出兩種處理用戶上傳圖片的方法,前后端代碼皆有前端后端的中間件提交告訴不要去處理發(fā)送的數(shù)據(jù)告訴不要去設(shè)置請(qǐng)求頭后端代碼用初始化項(xiàng)目之后,新建一個(gè)路由文件路由設(shè)置上傳的圖片文件存放的地方為根目錄下的文件夾
原文首發(fā):https://shuirong.github.io/
博主經(jīng)過(guò)實(shí)踐,這里給出兩種處理用戶上傳圖片的方法,前后端代碼皆有.
1. 前端jQuery,后端Express的Multer中間件
index.html
fontend.js
function deal(){ let file = new FormData(document.getElementById("picForm")); file.append("CustomField", "This is some extra data"); $.ajax({ url: "/update", type: "POST", data: file, processData: false, /* 告訴jQuery不要去處理發(fā)送的數(shù)據(jù)*/ contentType: false /* 告訴jQuery不要去設(shè)置Content-Type請(qǐng)求頭*/ }); }
backend.js
/*后端代碼:用express初始化項(xiàng)目之后,新建一個(gè)路由文件.路由update. update.js */ var express = require("express"); var router = express.Router(); var multer = require("multer"); var upload = multer({ dest: "uploads/" /*設(shè)置上傳的圖片/文件存放的地方為根目錄下的uploads文件夾*/ }); /*single(fieldName) 中的fieldName必須和HTML中input的屬性name的值一樣*/ router.post("/",upload.single("avatar"),function(req,res,next) { console.log(req.file); /* req.file 是 `logo` 文件的信息*/ console.log(req.body); /* req.body 保存表單文本域數(shù)據(jù), 如果存在的話*/ res.send("Upload Done !"); }); module.exports = router;
多圖片上傳
和單圖上傳并預(yù)覽基本一個(gè)套路.
/*其他地方和上面的一樣. update.js*/ router.post("/",upload.array("avatars",3),function(req,res,next) { console.log(req.files); /* req.files 是 `avatars` 文件數(shù)組的信息*/ console.log(req.body); /* req.body 保存表單文本域數(shù)據(jù), 如果存在的話*/ res.send("Upload Done !"); });
2. 前后端皆原生JS
前端把圖片轉(zhuǎn)換成base64格式,后端再轉(zhuǎn)成二進(jìn)制數(shù)據(jù)(存成圖片)
index.html
fontend.js
inputChange(e) { const files = e.target.files[0]; const reader = new FileReader(); reader.onload = (ee) => { const data = { base64: ee.target.result, }; post(this.uploadUrl, data).then((res) => { // 根據(jù)返回?cái)?shù)據(jù)做些處理. }).catch((err) => { console.info("Error", err); }); }; reader.readAsDataURL(files); } /* 這里把xhr的post給封裝了 */ post(url, data) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.onreadystatechange = () => { if (xhr.readyState === 4) { if (xhr.status >= 200 && (xhr.status < 300 || xhr.status === 304)) { resolve(JSON.parse(xhr.responseText)); } else { reject(`XHR unsuccessful:${xhr.status}`); } } }; xhr.open("post", url, true); xhr.setRequestHeader("content-type", "application/json"); xhr.send(JSON.stringify(data)); }); }
backend.js
const express = require("express"); const router = express.Router(); const fs = require("fs"); router.route("/") .post(upload.single("image"), (req, res) => { let base64 = req.body.base64; //去掉base64數(shù)據(jù)最前面的"圖片類型"字符串 let type = base64.match(/^data:image/(.+);/)[1]; base64 = base64.replace(/^data:image/w+;base64,/, ""); // 解碼base64成二進(jìn)制數(shù)據(jù). let data = new Buffer(base64, "base64"); const name = `uploads/images/${String(new Date()).replace(/[ :]/g,"").match(/.{6}(.{12})/)[1]}.${type}`; fs.open(name, "a", 0644, function(e, fd) { if (e) throw e; fs.write(fd, data, function(e) { if (e) throw e; fs.closeSync(fd); res.json({ "path": name.replace("uploads", ""), }); }); }); }); module.exports = router;
PS: 關(guān)于美化文件上傳按鈕,一個(gè)思路就是設(shè)置input的opacity為0,然后在外面包裹一個(gè)div.
PPS: CSS的奇技淫巧還是很多的.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/86990.html
摘要:目前覺(jué)得對(duì)我有用的是和。后者可以在本地調(diào)試頁(yè)面,對(duì)于手機(jī)頁(yè)面尤其有用。這次主要說(shuō)一下,我并沒(méi)有實(shí)現(xiàn)所有的功能,只是實(shí)現(xiàn)單圖片上傳這一個(gè)功能,其他的再摸索嘍。目前就這樣,下次弄出來(lái)了多圖片上傳我再接著更新。 這兩天在看《nodejs權(quán)威指南》,這本書(shū)看了好久了,但是讀的一直不細(xì),這次才好好看了一遍。 收獲還是蠻多的,主要在于wenpack使用的一些細(xì)節(jié)問(wèn)題,有點(diǎn)茅塞頓悟的體驗(yàn)吧,另外在n...
摘要:對(duì)象包含表單的文本域信息,或?qū)ο蟀瑢?duì)象表單上傳的文件信息。是文件的信息前端傳遞的文件類型在中獲取將具有文本域數(shù)據(jù),如果存在的話。 node.js實(shí)現(xiàn)formdata上傳文件 1.關(guān)于formdata XMLHttpRequest Level 2 添加了一個(gè)新的接口——FormData。利用 FormData 對(duì)象,我們可以通過(guò) JavaScript 用一些鍵值對(duì)來(lái)模擬一系列表單控件,...
摘要:前言本期的主題是在中如何實(shí)現(xiàn)文件上傳。文件上傳解決方案目前比較主流的解決方案就是表單或者和表單來(lái)實(shí)現(xiàn)。文件上傳解決方案表單利用表單組件進(jìn)行文件上傳是遠(yuǎn)古時(shí)期就一直在用的方法而且還真經(jīng)久不衰,厲害了。 終于抽出時(shí)間來(lái)繼續(xù)更新自己的博客,最近忙得夠嗆...對(duì)于該系列博客不知道大家有沒(méi)有這樣的看法,對(duì)于React常見(jiàn)的基礎(chǔ)東西并沒(méi)有過(guò)多或者詳細(xì)列出,感覺(jué)有點(diǎn)不符合系列標(biāo)題。的確,筆者一開(kāi)始也...
摘要:把文件上傳路徑指定到然后用當(dāng)前日期和文件名命名上傳過(guò)來(lái)的文件。后端利用建立服務(wù)器,利用中間件指定文件路徑。利用這個(gè)前端和后端技術(shù),我們基本上就可以做出一個(gè)圖片上傳存儲(chǔ)的基本網(wǎng)站核心。 前幾天看了騰訊云社區(qū)的一個(gè)文件上傳的文章文件上傳那些事兒,大體上講了以下h5中圖片上傳的幾個(gè)核心原理,但是沒(méi)有后端接受的服務(wù)器代碼,沒(méi)法做測(cè)試。也沒(méi)有具體的一個(gè)實(shí)例都是一些基本的原理片段,并且ui界面也不...
摘要:前段時(shí)間面試過(guò)程中,頻繁遇到異步文件上傳的相關(guān)問(wèn)題。所以,這會(huì)是一個(gè)拖放接口實(shí)現(xiàn)文件異步上傳的完整。監(jiān)聽(tīng)放置元素的事件,通過(guò)對(duì)象可以獲得拖拽事件的狀態(tài)及數(shù)據(jù)。后端文件接收保存后端使用實(shí)現(xiàn)文件上傳。 ??前段時(shí)間面試過(guò)程中,頻繁遇到H5異步文件上傳的相關(guān)問(wèn)題。還遇到過(guò)一個(gè)通過(guò)H5拖放功能實(shí)現(xiàn)文件異步上傳的問(wèn)題,大概知道H5有新增拖拽功能可以接收文件,如何異步上傳文件就母雞了(攤手)。面試...
閱讀 4376·2021-11-24 10:24
閱讀 1412·2021-11-22 15:22
閱讀 2042·2021-11-17 09:33
閱讀 2447·2021-09-22 15:29
閱讀 520·2019-08-30 15:55
閱讀 1660·2019-08-29 18:42
閱讀 2737·2019-08-29 12:55
閱讀 1777·2019-08-26 13:55