成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

一步一步搭建一個(gè)圖片上傳網(wǎng)站(后臺(tái)服務(wù)器用nodejs)

Darkgel / 1573人閱讀

摘要:把文件上傳路徑指定到然后用當(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界面也不好看,我就準(zhǔn)備給那篇文章作為補(bǔ)充做一個(gè)圖片上傳網(wǎng)站。
效果如圖:


點(diǎn)擊上傳后,會(huì)把文件放到后臺(tái)一個(gè)uploads文件夾下面,如果上傳成功,那么頁(yè)面會(huì) 彈出一個(gè)上傳成功的提示框,如果上傳失敗,會(huì)彈出一個(gè)失敗的提示框,如果網(wǎng)速比較慢,會(huì)顯示出上傳過(guò)程中的進(jìn)度條。

開(kāi)發(fā)準(zhǔn)備 用普通的表單提交方法實(shí)現(xiàn)文件上傳。

1.編寫(xiě)前端代碼

設(shè)置action為提交地址,enctype="multipart/form-data"

設(shè)置提交文件表單域名為imgfile

2.編寫(xiě)后端測(cè)試用代碼

這里我們采用了express框架,需要先安裝這個(gè)框架,然后使用靜態(tài)中間件指定放置我們js css html 文件的目錄

var app = express();
app.use(express.static("dist"))

下載處理上傳文件的插件multer
在readme.md文件中有基本的使用方法,我們復(fù)制過(guò)來(lái)代碼實(shí)例稍微改改就可以使用了。把文件上傳路徑指定到uploads,然后用當(dāng)前日期和文件名命名上傳過(guò)來(lái)的文件。這個(gè)imgfile域名必須嚴(yán)格和前端表單文件域名對(duì)應(yīng)起來(lái)。

完整代碼如下:

"use strict";
exports.__esModule = true;
var express = require("express");
var multer = require("multer");
var storage = multer.diskStorage({
    destination: function(req, file, cb) {
        cb(null, "./uploads");
    },
    filename: function(req, file, cb) {
        cb(null, `${Date.now()}-${file.originalname}`)
    }
})
var upload = multer({ storage: storage });
var app = express();
app.use(express.static("dist"));
//var cpUpload = upload.fields([{ name: "imgfile", maxCount: 12 }])
app.post("/uploadimg", upload.array("imgfile", 40), function(req, res, next) {
    var files = req.files
    console.log(files)
    if (!files[0]) {
        res.send("error");
    } else {
        res.send("success");
    }



    console.log(files);
})

var server = app.listen(9999, "localhost", function() {
    console.log("server is running at port 9999...");
});

這樣選擇文件,點(diǎn)擊提交按鈕后文件就被上傳到了服務(wù)器uploads文件夾下

用H5和ajax技術(shù)實(shí)現(xiàn)無(wú)刷新文件上傳

1.改造原來(lái)的選擇文件按鈕,讓它變成一個(gè)可愛(ài)的小圖標(biāo),點(diǎn)擊后選擇文件。
這個(gè)過(guò)于簡(jiǎn)單就不放代碼了,具體思路是把一個(gè)a標(biāo)簽放上背景圖片,把上傳文件input type="file"大小設(shè)置成a標(biāo)簽一樣大,并且放置到a標(biāo)簽上面,opacity設(shè)置成0透明的。點(diǎn)擊a實(shí)際上是點(diǎn)擊了input type="file"
2.選取文件后生成縮略圖,這個(gè)基本思路是監(jiān)聽(tīng)input type="file"的onchange事件,如果選了文件就利用FileReader生成一個(gè)圖片data:url添加到div.preview里面動(dòng)態(tài)生成的img上,給div.preview設(shè)置成flex布局就可以靈活放置預(yù)覽圖了。
html

    

js

   fileinput.onchange = () => {
            //console.log("ffffdd")
            var files = fileinput.files
            let imgDOMArray = new Array(files.length)
            let reader = []
            let thumbPic = []
            progressDOM = document.getElementById("progress-img")
            for (let i = 0; i < files.length; i++) {
                reader[i] = new FileReader()
                thumbPic[i] = document.createElement("div")
                imgDOMArray[i] = document.createElement("img")
                imgDOMArray[i].file = files[i]
                thumbPic[i].className = "thumbPic"
                thumbPic[i].appendChild(imgDOMArray[i])
                previewDOM.appendChild(thumbPic[i])
                reader[i].readAsDataURL(files[i])
                reader[i].onload = (img => {

                    return e =>img.src = e.target.result
                    
                })(imgDOMArray[i])

            }
        }

3.點(diǎn)擊上傳按鈕上傳圖片
這個(gè)基本思路就是利用Formdata模擬表單,然后用ajax發(fā)送文件到服務(wù)器

        var aUpload = document.querySelector(".selectImg")
        var button = document.querySelector("#upload")
        var fileinput = document.getElementById("file")
        button.onclick = uploadFile
         function uploadFile() {
            //  console.log("ffffd")
            var xhr = new XMLHttpRequest()
            var formdata = new FormData()

            var files = fileinput.files
            if (!files[0]) {
                alert("請(qǐng)先選擇圖片,再上傳!")
                return
            }

            var progress = document.querySelector("progress")
            for (let i = 0; i < files.length; i++) {
                formdata.append("imgfile", files[i], files[i].name)
            }
            xhr.open("POST", "/uploadimg")
            xhr.onload = () => {
                if (xhr.status === 200 && xhr.responseText === "success") {
                    previewDOM.innerHTML = ""
                    xhr = null
                    alert("圖片上傳成功!")
                }
            }
            xhr.send(formdata)
            xhr.upload.onprogress = e => {
                if (e.lengthComputable) {
                    var progressWrap = document.querySelector(".progress")
                    progressWrap.style.display = "flex"
                    var percentComplete = e.loaded / e.total * 100
                    progress.value = percentComplete

                    if (percentComplete >= 100) {
                        progress.value = 0
                        progressWrap.style.display = "none"
                    }
                }
            }

        }

其中利用了xhr.upload.onprogress監(jiān)聽(tīng)數(shù)據(jù)上傳事件,并且動(dòng)態(tài)設(shè)置h5進(jìn)度條的value顯示上傳進(jìn)度。如果上傳完成,隱藏進(jìn)度條。
如果服務(wù)器返回的是success,就彈出上傳圖片成功。否則彈出上傳圖片失敗。

總結(jié)
前端利用了FileReader 的readAsDataUrl顯示縮略圖,利用H5 progress標(biāo)簽和監(jiān)聽(tīng)xhr.upload.onprogress顯示進(jìn)度條。利用FormData模擬表單數(shù)據(jù),用ajax技術(shù)提交到服務(wù)器。
后端利用express建立服務(wù)器,利用static中間件指定js css html 文件路徑。用multer模塊實(shí)現(xiàn)了解析存儲(chǔ)通過(guò)input typle="file"提交的數(shù)據(jù)。
利用這個(gè)前端ajax和后端nodejs技術(shù),我們基本上就可以做出一個(gè)圖片上傳存儲(chǔ)的基本網(wǎng)站核心。如果數(shù)據(jù)量比較大我們就可以采用數(shù)據(jù)庫(kù)存儲(chǔ)索引搜索,不過(guò)這已經(jīng)跟前端沒(méi)啥關(guān)系就不展開(kāi)講了。

獲取代碼

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/82874.html

相關(guān)文章

  • 2016年總結(jié)--成長(zhǎng)

    摘要:馬爾代夫之行重頭戲這一年的工作情況這一年,個(gè)人感覺(jué)還是做了不少事情,主要集中在我們公司的前端領(lǐng)域,同時(shí)也給整個(gè)技術(shù)團(tuán)隊(duì)不少的建議,引入了不少新的東西和方式,總結(jié)起來(lái)比較重要的在下面五個(gè)方面。 如果想看技術(shù)相關(guān)的,下拉到后面的重頭戲就是了。 一個(gè)活動(dòng)頁(yè)面 在15年末的時(shí)候,加入到羅輯思維,剛過(guò)來(lái)就接手了一個(gè)微信朋友圈要傳播的活動(dòng)頁(yè)面,效果頁(yè)面大概和當(dāng)時(shí)錘子手機(jī)的活動(dòng)頁(yè)面漂亮的不像實(shí)力派類(lèi)...

    niuxiaowei111 評(píng)論0 收藏0
  • 我的全站https之路

    摘要:網(wǎng)站是自己個(gè)人的網(wǎng)站,后臺(tái)用的服務(wù)器用的阿里云的操作系統(tǒng)是。證書(shū)證書(shū)用的阿里云的云盾證書(shū)因?yàn)樽约悍?wù)器就在阿里云,當(dāng)然最大的原因還是免費(fèi)。七牛云的圖片資源,改后請(qǐng)求不了。 文章地址 背景 很早前就想著升級(jí)https,總覺(jué)得會(huì)很難自己想用nginx但是也沒(méi)用過(guò)不會(huì)弄就一直拖著,前兩天突然決定搞一下,沒(méi)想到一天多時(shí)間就搞完了,所以人還是要多嘗試,有這個(gè)想法還沒(méi)搞的人要趕快動(dòng)起來(lái)啦。這里記錄...

    nifhlheimr 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<