1. 程式人生 > >一鍵jquery非同步上傳檔案(圖片)的實現(檔案上傳進度讀取未做)

一鍵jquery非同步上傳檔案(圖片)的實現(檔案上傳進度讀取未做)

本文采用boostrap、、jquery、jade(html的一種模板)、nodejs實現

最終實現的效果:一個按鈕在選擇完檔案後,自動上傳到後臺;

-改變input樣式

在form表單中,用<a>包裹<input type="file">,讓input隱藏,jade程式碼如下

form#index_new.form-horizontal(method="post",role="form",action="/admin/index/save",enctype="multipart/form-data")
  input(type="hidden",name="index[_id]",value="#{index._id}")
    .col-sm-2
      a.btn.btn-primary.upload_index_img_box 新增圖片
        input(type="hidden",name="posterType",value="index")
        input#upload_index_img(type="file",name="upload_poster") 

其中第一個input(type="hidden")的作用是用來提交表單的資料index的_id到後臺伺服器,以使得後臺接收到index._id的時候為'undefined'(個人處理習慣)

第二個input(type="hidden")的作用是用來提交圖片型別到後臺,也就是posterType='index'這個值,作為識別符號,以方便檔案的分類管理

利用”事件捕獲“和”事件冒泡“,給外層a繫結點選事件來觸發內層的input(type="file")以選擇檔案,原始碼如下

	var btnChooseFile = $('.upload_index_img_box');
	var btnChooseHide = $('#upload_index_img');
	btnChooseFile.click(function(event){
		event.stopPropagation();
		console.log(event.target);
		console.log(this);
		if (event.target==this) {
			btnChooseHide.click();
			
		}
	});

其中.stopPropagation()用來阻止<a>的預設動作(似乎沒有派上用場),由event.target==this來確保點選的物件是外層的<a>

為內層隱藏的input(type="file")設定.change()監聽,上傳結束時,觸發ajax,向伺服器端傳送資料:

btnChooseHide.change(function(event){
		if (btnChooseHide.val()!=='undefined') {
			//html5的生成的表單資料物件
			var form = new FormData($('#index_new')[0]);
        	$.ajax({
        	        url: '/admin/index/save',
        	        type: 'post',
        	        //傳送到伺服器端的資料的格式,取消預設編碼格式
        	        contentType:false,
        	        dataType:'json',
        	        data: form,
        	        //因為是圖片,不要對其作序列化處理
        	        processData:false,
        	        success: function (data) {
        	        	if (data){
        	        	//對伺服器返還的資料進行拼接處理
        	        		var id = data.index._id;
        	        		var img = data.index.img;
        	        		var date = data.index.meta.updateAt.split('T')[0];
        	        		var html = $('<tr class="item-id-'+id+'"></tr>')
        	        		var tdName = $('<td><a class="thumbnail"><img src="/upload/index/'+img+'" alt="點選檢視大圖"/></a></td>');
        	        		var tdDate = $('<td>'+date+'</td>');
        	        		var del = $('<td><button class="btn btn-danger del" type="button" data-id="'+id+'" data-type="index">刪除</button></td>')
        	        		html.appendTo(tbody);
        	        		tdName.appendTo(html);
        	        		tdDate.appendTo(html);
        	        		del.appendTo(html);
                    	}
                	},
                	err:function(jqHXR){
						console.log(jqXHR.status);
                	}
            });
        return false;
		}
	});

這其中contentType不能設定為multipart/form-data,否則會報錯。關鍵的三點是contentType、dataProcess、new FormData(),否則檔案無法傳到後臺。

伺服器端實現:

根據傳過來的資料,進行一系列處理後,以初始路徑地方式讀取傳過來的檔案,再生成新的指定路徑和新的檔名稱,將檔案寫入到該路徑下。完成檔案的儲存後,將資料傳給前端,前端以jquery的方式對資料進行拼接插入,從而實現非同步更新。

此外,資料還要對模板進行渲染,否則重新整理頁面後無法顯示。

處理圖片上傳的中介軟體如下:

var fs = require('fs');
var path = require('path');
exports.save_poster = function(req,res,next){
	console.log('req.files');
	console.log(req.files);
	var posterData = req.files.upload_poster;
	var posterType = req.body.posterType;
	var filePath = posterData.path;
	var originalFilename = posterData.originalFilename;
	if (originalFilename) {
		fs.readFile(filePath,function(err,data){
			//生成日期
			var timestamp = Date.now();
			//獲取圖片格式
			var type = posterData.type.split('/')[1];
			//由“日期.圖片格式”生成檔名
			var posterName = timestamp+'.'+type;
			//__dirname獲取當前資料夾(只是資料夾,不包括檔案本身)的絕對路徑
			//合併下面的路徑生成圖片檔案的儲存路徑
			var newPath = path.join(__dirname,'../../','/public/upload/'+posterType+'/'+posterName);
			fs.writeFile(newPath,data,function(err){
				req.poster = posterName;
				next();
			});
		});
	}
	else{
		next();
	}
};
前端圖片的顯示,以路徑的方式顯示即可,比如<img  src="/upload/index/檔名"/>,把檔名傳遞到前端即可

相關推薦

jquery非同步檔案圖片實現檔案進度讀取

本文采用boostrap、、jquery、jade(html的一種模板)、nodejs實現 最終實現的效果:一個按鈕在選擇完檔案後,自動上傳到後臺; -改變input樣式 在form表單中,用<a>包裹<input type="file">,讓i

spring-boot-route實現檔案

Spring Boot預設上傳的單個檔案大小`1MB`,一次上傳的總檔案大小為`10MB`。 單個檔案上傳使用MultipartFile引數來接收檔案,多檔案使用MultipartFile[]陣列來接收,然後遍歷它,當成單檔案來處理。 **問題一**:如何配置上傳檔案大小限制? ```java @Con

推薦丨工具-電腦 截圖+OCR文字識別工具--天若OCRwindows系統

最近突然有需要,希望在一些只讀檔案還有視訊裡面識別文字,然後就想找找看有沒有相關的工具。 然後就找到了這個工具,確實挺不錯的,作者也有更新。(可以在文末看作者發的帖子1) 簡介 OCR OCR(Optical Character Recognition),光學字元識

式解壓tar, tar.gz. tar.bz2, tar.xv檔案的shell指令碼【轉】

tar,  tar.gz. tar.bz2, tar.xv等檔案的壓縮和解壓縮引數讓人實在蛋疼, 本著沒有輪子就自己造的原則,寫了這個指令碼,歡迎拍磚. #!/bin/bash #Description: untar *.tar.xz , *.tar.gz, *

基於IE核心的多媒體檔案視覺化程式實現

目的 前回書說道,在訊號處理或演算法研究中,資料的視覺化可以直觀地展現和判別結果的合理性。如果只允許用C語言做開發,或要將C語言所做演算法的輸出資料進行展示,又不許用MATLAB、Python所帶的視覺化工具,那麼,最快捷而直接的辦法就是將資料以文字方式輸出,再

vue實現星級評價及多張圖片等功能類似淘寶商品評價頁面

最近在寫一個關於vue的商城專案,然後整合在移動端中,開發需求中有一介面,類似淘寶商城評價介面!實現效果圖如下所示: 評價頁 點選看大圖,且可左右滑動 功能需求分析 預設為5顆星,為非常滿意,4顆滿意,根據不同星級顯示不同滿意程度。 2.評價內容,最

LNMP安裝包常用命令、軟體安裝目錄及配置檔案路徑

LNMP常用命令 狀態管理LNMP狀態管理: /root/lnmp {start|stop|reload|restart|kill|status} Nginx狀態管理:/etc/init.d/nginx {start|stop|reload|restart}

LNMP環境徹底刪除繫結域名及網站資料夾/檔案的過程

在國內的Linux VPS一鍵環境安裝中使用軍哥LNMP還是比較多的,這不老左也在打算重新整理一遍基於我們常用的國內一鍵包從安裝、部署、建站、簡單的運維繫列教程。今天一個朋友使用LNMP搭建的WEB環境中有幾十個網站,有大部分是不需要使用的,希望刪除目錄、解除繫結。

pyhon檔案操作典型程式碼實現非常經典!

1. 編寫一個程式,統計當前目錄下每個檔案型別的檔案數,程式實現如圖: 實現程式碼: import os all_files = os.listdir(os.chdir("D:\\")) type_dict = dict() for each_file in all_files: if os.pa

基於IE核心的多媒體檔案視覺化程式實現

文章目錄 使用命令列引數 命令列引數獲取和解析程式碼 幫助系統 執行測試 WSEE的功能還不只如此 現在的結果 上回說道,我們需要使用命令列引數方法將要瀏覽的檔名傳入wsee.exe 程式,然後由

ZynqNet解析實現於BRAM的Cache

背景:我們需要仿照ZynqNet的模式構造卷積的IPcore用於FPGA的優化。 目的:搞懂zynqNet的cache的實現。 相關內容: 幾種Cache 四種on-chip cache(report 4.2.4)     ICache(Image ca

每天個數據結構----棧的鏈式儲存結構實現純程式碼

// //  main.c //  StackList2 棧的鏈式儲存結構 // //  Created by Jacobs.Guo on 2018/4/23. //  Copyright © 2018年 yage guo. All rights

設計模式之UML類圖以及類間關係泛化 、實現、依賴、關聯、聚合、組合

類圖用於描述系統中所包含的類以及它們之間的相互關係,幫助人們簡化對系統的理解,它是系統分析和設計階段的重要產物,也是系統編碼和測試的重要模型依據。接下來我們就來談談類圖的組成,在下一篇中我們將討論一下類圖之間的關係。 一、類圖的組成 1. 普通類 上圖

Linux下程式C語言實現檔案的複製

目標: 使用系統呼叫實現cp命令。 原理: 使用系統呼叫open開啟檔案,使用read從檔案讀資料,使用write向檔案寫資料。 傳給可執行程式的引數個數存放在main函式的argc中,引數首地址存放在指標陣列argv中。 我的程式碼: #include <stdio.h&

asp 批量同時文字和圖片實現

先上程式碼: 表單部分: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http

java多張圖片,並且可以刪除圖片

如果你想只上傳一張圖片:http://blog.csdn.net/xuanzhangran/article/details/54928997 上傳多張: 可以刪除從庫裡查詢出來的圖片,也可以刪除剛上傳到圖片,其實不多,為了任務請耐心看完: 效果如下: 1

keras面向小資料集的影象分類VGG-16基礎fine-tune實現附程式碼

參考譯文地址:http://keras-cn.readthedocs.io/en/latest/blog/image_classification_using_very_little_data/ 本文作者:Francois Chollet 概述 在本文中,將使用VGG-16模型提供一種面向小資料集(幾百

fastdfs 新新增一個專案的圖片目錄 實現獨立的下載功能

1,功能需求Fastdfs已經安裝完成,部署過程見:http://blog.csdn.net/mchdba/article/details/50933405,fastdfs安裝啟動後,預設只有一個group1,只能適合用於一個專案;那麼如果有新專案過來了,是否需要再準備新的l

記憶體檔案系統c/c++實現VS2008

#include <stdio.h> #include<string.h> #include <map> #include <malloc.h> #define NO 0 #define OK 1 //檔案定義 struct file { char fil

【特徵工程】種異常值檢測方法、原理、程式碼實現 基於箱線圖

先介紹使用到的方法原理,也就是一種異常檢測的方法。 首先要先了解箱線圖。 箱線圖 箱線圖(Boxplot)也稱箱須圖(Box-whisker Plot),是利用資料中的五個統計量:最小值、第一四分位數、中位數、第三四分位數與最大值來描述資料的一種方法,它也可以