天天看點

HTML5 檔案異步上傳 — h5uploader.js

HTML5 檔案異步上傳 — h5uploader.js

原文位址:http://imziv.com/blog/article/read.htm?id=62

之前寫過一篇H5異步檔案上傳的文章, 但是很多朋友看着我的這個教程還是出現很多問題,文章寫的不是很好,比較早了。其實通過H5做異步上傳已經非常簡單了,通過檢視文檔,便可以很輕松的完成這個功能,當然,如果你不願意檢視文檔自己動手的話,那麼就用插件咯。h5uploader是我最近封裝的HTML5上傳插件,代碼才白來行,使用的話也比較簡單,支援檔案大小,類型,progress等等功能。本篇教程,将向你展示Nodejs,Java兩種服務端的上傳方法,并且附有源代碼示例。

插件下載下傳

如果你是

bower

的使用者的話,可以直接通過以下指令:

bower install h5uploader --save           

當然也可以直接從Github Clone此項目:

git clone https://github.com/wewoor/h5uploader.git           

HTML代碼

<input type="file" id="myfile" value="" name="myfile" multiple="multiple"/>
<button id="uploader">Upload</button>           

以上是一個file類型的input元素以及一個上傳觸發按鈕,後面帶有multiple屬性,表示次處支援檔案多選上傳,當然,你也可以一次送出多個input元素,例如:

<input type="file" id="myfile" value="" name="myfile" multiple="multiple"/>
<input type="file1" id="myfile1" value="" name="myfile" multiple="multiple"/>
<button id="uploader">Upload</button>           

這種方法同樣是可以的,隻不過服務端解析的時候要更麻煩。

Javascript

<script type="text/javascript" src="html5uploader.js"></script>
    <script type="text/javascript">
     var uploader = document.getElementById('uploader');
        uploader.addEventListener("click", function(e) {

        H5Uploader.upload({
            action: 'upload',
            id: 'myfile0',
            size: {
                max: 5000, // 5000kb 
                valide: function(e) {
                    if (e) {
                        alert("The size of " + e.name + " is exceed max value!");
                    }
                }
            }, // MB
            type: {
                name: 'csv;png;jpg',
                valide: function(e) {
                    if (e) {
                        alert("The type of " + e.name + " is not supported!");
                    }
                }
            },
            progress: function() {
                    var p = document.createElement('p');
                    p.innerHTML = "uploading";
                    p.id = "loading";
                    document.body.appendChild(p);
            },
            success: function(data) {
                alert(data);
                if (data && data == 200) {
                    document.getElementById('loading').innerHTML = "The file upload successfully!";
                    alert("The file upload successfully.");
                }
            },
            fail: function(data) {

            }
        });

    }, false);
    </script>           

以上是針對單個input元素的上傳,

H5Uploader.upload()

方法是支援

Array

類型和

Object

類型的,也就是說,如果你有多個input元素同時上傳的需求的話,你可以這樣寫:

uploader.addEventListener("click", function(e) {

        H5Uploader.upload([{
            action: 'upload',
            id: 'myfile0',
            size: {
                max: 5000, // 5000kb 
                valide: function(e) {
               }
            }, // MB
            type: {
                name: 'csv;json',
                valide: function(e) {
               }
            },
            progress: function() {
                               },
            success: function(data) {
            },
            fail: function(data) {

            }
        },{
            action: 'upload',
            id: 'myfile1',
            size: {
                max: 5000, // 5000kb 
                valide: function(e) {
               }
            }, // MB
            type: {
                name: 'png;jpg',
                valide: function(e) {
               }
            },
            progress: function() {
            },
            success: function(data) {
            },
            fail: function(data) {

            }
        }]);

    }, false);           

Nodejs服務端

服務端是expressjs,利用的一個上傳中間件

multer

var express = require('express');
var multer = require('multer');
var app = express();
var done = false;

app.use(express.static('./public'));

// respond with "hello world" when a GET request is made to the homepage
app.post('/upload',[multer({dest: './uploads/'}), function(req, res) {
    try {
        console.log(req.body.myfile);
        console.log(req.files);
        res.json(200);
    } catch (e) {
        console.log(e);
    }
}]);           

完整的示例代碼,請看

Java servlet示例

此處沒有用任何架構或者庫,隻是

Servlet3.0

, 用tomcat6的同學要注意哦。

package com.h5uploader.demo;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;


@MultipartConfig
public class UploaderServlet extends HttpServlet {
    
    public void service(HttpServletRequest req, HttpServletResponse res) 
            throws IOException, ServletException {
        
        res.setContentType("text/html;charset=UTF-8");

        // Create path components to save the file
        final String path = "/Users/ziv/Desktop/";
        final Part filePart = req.getPart("myfile0");
        final String fileName = getFileName(filePart);

        OutputStream out = null;
        InputStream filecontent = null;
        final PrintWriter writer = res.getWriter();
        
        try {
            out = new FileOutputStream(new File(path + File.separator
                    + fileName));
            filecontent = filePart.getInputStream();

            int read = 0;
            final byte[] bytes = new byte[1024];

            while ((read = filecontent.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }
            writer.println("New file " + fileName + " created at " + path);
           
        } catch (FileNotFoundException fne) {
            writer.println("You either did not specify a file to upload or are "
                    + "trying to upload a file to a protected or nonexistent "
                    + "location.");
            writer.println("<br/> ERROR: " + fne.getMessage());

            
        } finally {
            if (out != null) {
                out.close();
            }
            if (filecontent != null) {
                filecontent.close();
            }
            if (writer != null) {
                writer.close();
            }
                   

繼續閱讀