JavaScript移动端图片上传方法

移动端图片上传方法

实现效果 文件下载 http://files.cnblogs.com/files/sntetwt/%E7%A7%BB%E5%8A%A8%E7%AB%AF%E5%9B%BE%E7%89%87%E4%B8%8A%E4%BC%A0.rar


 

实现步骤

一、隐藏<input type="file" id="file" name="Filedata" style="display:none;" accept="image/*" />

二、创建上传按钮<div id="upload-box"></div>

三、绑定事件

 $("#upload-box").click(function () {

  $("#file").trigger("click");

})


插件代码jquery.uploadBase64.js

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

function UploadBase64() {

    this.sw = 0;

    this.sh = 0;

    this.tw = 0;

    this.th = 0;

    this.scale = 0;

    this.maxWidth = 0;

    this.maxHeight = 0;

    this.maxSize = 0;

    this.fileSize = 0;

    this.fileDate = null;

    this.fileType = '';

    this.fileName = '';

    this.input = null;

    this.canvas = null;

    this.mime = {};

    this.type = '';

    this.callback = function () { };

    this.loading = function () { };

}

 

UploadBase64.prototype.init = function (options) {

    this.maxWidth = options.maxWidth || 800;

    this.maxHeight = options.maxHeight || 600;

    this.maxSize = options.maxSize || 3 * 1024 * 1024;

    this.input = options.input;

    this.mime = { 'png''image/png''jpg''image/jpeg''jpeg''image/jpeg''bmp''image/bmp' };

    this.callback = options.callback || function () { };

    this.loading = options.loading || function () { };

 

    this._addEvent();

};

 

/**

* @description 绑定事件

* @param {Object} elm 元素

* @param {Function} fn 绑定函数

*/

UploadBase64.prototype._addEvent = function () {

    var _this = this;

 

    function tmpSelectFile(ev) {

        _this._handelSelectFile(ev);

    }

 

    this.input.addEventListener('change', tmpSelectFile, false);

};

 

/**

* @description 绑定事件

* @param {Object} elm 元素

* @param {Function} fn 绑定函数

*/

UploadBase64.prototype._handelSelectFile = function (ev) {

    var file = ev.target.files[0];

 

    this.type = file.type

 

    // 如果没有文件类型,则通过后缀名判断(解决微信及360浏览器无法获取图片类型问题)

    if (!this.type) {

        this.type = this.mime[file.name.match(/\.([^\.]+)$/i)[1]];

    }

 

    if (!/image.(png|jpg|jpeg|bmp)/.test(this.type)) {

        alert('选择的文件类型不是图片');

        return;

    }

 

    if (file.size > this.maxSize) {

        alert('选择文件大于' this.maxSize / 1024 / 1024 + 'M,请重新选择');

        return;

    }

 

    this.fileName = file.name;

    this.fileSize = file.size;

    this.fileType = this.type;

    this.fileDate = file.lastModifiedDate;

 

    this._readImage(file);

};

 

/**

* @description 读取图片文件

* @param {Object} image 图片文件

*/

UploadBase64.prototype._readImage = function (file) {

    var _this = this;

 

    function tmpCreateImage(uri) {

        _this._createImage(uri);

    }

 

    this.loading();

 

    this._getURI(file, tmpCreateImage);

};

 

/**

* @description 通过文件获得URI

* @param {Object} file 文件

* @param {Function} callback 回调函数,返回文件对应URI

* return {Bool} 返回false

*/

UploadBase64.prototype._getURI = function (file, callback) {

    var reader = new FileReader();

    var _this = this;

 

    function tmpLoad() {

        // 头不带图片格式,需填写格式

        var re = /^data:base64,/;

        var ret = this.result + '';

 

        if (re.test(ret)) ret = ret.replace(re, 'data:' + _this.mime[_this.fileType] + ';base64,');

 

        callback && callback(ret);

    }

 

    reader.onload = tmpLoad;

 

    reader.readAsDataURL(file);

 

    return false;

};

 

/**

* @description 创建图片

* @param {Object} image 图片文件

*/

UploadBase64.prototype._createImage = function (uri) {

    var img = new Image();

    var _this = this;

 

    function tmpLoad() {

        _this._drawImage(this);

    }

 

    img.onload = tmpLoad;

 

    img.src = uri;

};

 

/**

* @description 创建Canvas将图片画至其中,并获得压缩后的文件

* @param {Object} img 图片文件

* @param {Number} width 图片最大宽度

* @param {Number} height 图片最大高度

* @param {Function} callback 回调函数,参数为图片base64编码

* return {Object} 返回压缩后的图片

*/

UploadBase64.prototype._drawImage = function (img, callback) {

    this.sw = img.width;

    this.sh = img.height;

    this.tw = img.width;

    this.th = img.height;

 

    this.scale = (this.tw / this.th).toFixed(2);

 

    if (this.sw > this.maxWidth) {

        this.sw = this.maxWidth;

        this.sh = Math.round(this.sw / this.scale);

    }

 

    if (this.sh > this.maxHeight) {

        this.sh = this.maxHeight;

        this.sw = Math.round(this.sh * this.scale);

    }

 

    this.canvas = document.createElement('canvas');

    var ctx = this.canvas.getContext('2d');

 

    this.canvas.width = this.sw;

    this.canvas.height = this.sh;

 

    ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, this.sw, this.sh);

 

    this.callback(this.canvas.toDataURL(this.type));

 

    ctx.clearRect(0, 0, this.tw, this.th);

    this.canvas.width = 0;

    this.canvas.height = 0;

    this.canvas = null;

};

 


 

HTML代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

<!doctype html>

<html>

<head>

<meta charset="utf-8">

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">

<title>手机端图片上传</title>    

</head>

  

<body>

<script type="text/javascript" charset="utf-8" src="/scripts/jquery/jquery-1.11.2.min.js"></script>

<script src="scripts/jquery/jquery.uploadBase64.js" type="text/javascript"></script>

<input type="file" accept="image/*" id="file" style="display:none">

<div id="upload-box" style="width:200px;height:45px;line-height:45px;text-align:center;color:#fff; background:#02598e; cursor:pointer;">移动端图片上传</div>

<script>

    document.addEventListener('DOMContentLoaded', init, false);

    function init() {

        var u = new UploadBase64();

        u.init({

            input: document.querySelector('#file'),

            callback: function (base64) {

                $.ajax({

                    url: "/upload_ajax.ashx?action=UploadBase64",

                    data: { base64: base64, type: this.fileType },

                    type: 'post',

                    dataType: 'json',

                    success: function (i) {

                        alert(i.info);

                    }

                })

            },

            loading: function () {

 

            }

        });

    }

    $(function () {

        $("#upload-box").click(function () {

            $("#file").trigger("click");

        })

    })

</script>

</body>

</html>

 asp.net后台处理代码:upload_ajax.ashx

using System;

using System.Collections;

using System.IO;

using System.Collections.Generic;

using System.Web.SessionState;

using System.Web;

using System.Drawing;

 

namespace DianShang.Web.tools

{

    /// <summary>

    /// 文件上传处理页

    /// </summary>

    public class upload_ajaxs : IHttpHandler, IRequiresSessionState

    {

        public void ProcessRequest(HttpContext context)

        {

            //取得处事类型

            string action = context.Request.QueryString["action"];

 

            switch (action)

            {

                case "UpLoadBase64"://Base64编码上传

                    UpLoadBase64(context);

                    break;

                default://普通上传

                    UpLoadFile(context);

                    break;

            }

 

        }

        #region Base64编码上传===================================

        private void UpLoadBase64(HttpContext context)

        {

            Model.siteconfig siteConfig = new BLL.siteconfig().loadConfig();

            string _delpath = context.Request.Form["delpath"];

            string _upfile = context.Request.Form["base64"];           

            string[] tmpArr = _upfile.Split(',');

            byte[] base64 = Convert.FromBase64String(tmpArr[1]);

            MemoryStream ms = new MemoryStream(base64);

            System.Drawing.Image postedFile = System.Drawing.Image.FromStream(ms);

 

            string path = String.Format("/upload/{0}/{0}.jpg", DateTime.Now.ToString("yyyyMMddHHss"));

 

            //保存文件

            postedFile.Save(context.Server.MapPath(path));

            //处理完毕,返回JOSN格式的文件信息

            context.Response.Write("{\"status\": 1, \"msg\": \"上传文件成功!\", \"path\": \"" + path + "\"}");

            context.Response.End();

             

        }

        #endregion

 

        #region 普通上传===================================

        private void UpLoadFile(HttpContext context)

        {

             

        }

        #endregion

         

        public bool IsReusable

        {

            get

            {

                return false;

            }

        }

    }

}

 

"唯有高屋建瓴,方可水到渠成"

大爷,请赏我点铜板买喵粮自己吃,您的支持将鼓励我继续创作!(支付宝)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值