Jquery图片上传功能整理

最近在做一个图片上传到服务器的功能,之前基本没有什么JS的经验,用的也是网上的插件。做了一个星期才把他弄好,现在做一下总结,方便以后查看。

用的插件是WebUploader,上面有很多例子,我找的例子如下图:

在实例化WebUploader的时候需要修改upload.js文件中的server的地址,这样才能将指定的图片上传到服务器代码如下:

     // 实例化
        uploader = WebUploader.create({
            pick: {
                id: ‘#filePicker‘,
                label: ‘点击选择图片‘
            },
            formData: {
                uid: 123
            },
            dnd: ‘#dndArea‘,
            paste: ‘#uploader‘,
            swf: ‘Uploader.swf‘,
            chunked: false,
            chunkSize: 512 * 1024,
            server:‘Handler1.ashx‘,//用来处理上传图片的服务
            // runtimeOrder: ‘flash‘,
            //文件过滤
             accept: {
                 title: ‘Images‘,
                 extensions: ‘gif,jpg,jpeg,bmp,png‘,
                 mimeTypes: ‘image/*‘
             },
        });

需要注意的是,Handler1.ashx是一个处理上传图片的服务,用于将上传的图片保存到服务器上,文件代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Net;
using System.Web;
using System.Web.Services;

namespace JQueryUploadDemo
{
    /// <summary>
    /// $codebehindclassname$ 的摘要说明
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

    public class UploadHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            context.Response.Charset = "utf-8";
            HttpPostedFile file = context.Request.Files["Filedata"];
            string  uploadPath = HttpContext.Current.Server.MapPath(@context.Request["folder"])+"\\";
            if (file != null)
            {
               if (!Directory.Exists(uploadPath))
               {
                   Directory.CreateDirectory(uploadPath);
               }
               file.SaveAs(uploadPath + file.FileName);
                //下面这句代码缺少的话,上传成功后上传队列的显示不会自动消失
               context.Response.Write("1");
            }
            else
            {
                context.Response.Write("0");
            }
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

完成上传时候,前端需要获取服务器返回的数据,用于保存在数据库,找了半天,最后在webuploader.js的_finishFile函数中找到了,这里只显示部分代码:

// 完成上传。
            _finishFile: function( file, ret, hds ) {
                var owner = this.owner;
                postfilename=ret._raw;//获取服务器返回的参数
                return owner
                        .request( ‘after-send-file‘, arguments, function() {
                            file.setStatus( Status.COMPLETE );
                            owner.trigger( ‘uploadSuccess‘, file, ret, hds );
                        })
                        .fail(function( reason ) {

                            // 如果外部已经标记为invalid什么的,不再改状态。
                            if ( file.getStatus() === Status.PROGRESS ) {
                                file.setStatus( Status.ERROR, reason );
                            }

                            owner.trigger( ‘uploadError‘, file, reason );
                        })
                        .always(function() {
                            owner.trigger( ‘uploadComplete‘, file );
                        });
            },

获取返回的数据之后需要将数据传递到upload.js里面,用于保存到数据库中,upload.js中有stats = uploader.getStats(),是获取返回的一些信息的,在updateStatus函数

下面会贴出代码。但是stats对象中没有获取服务器返回的参数,只返回了上传的基本信息,这时候就需要在webuploader.js中的Queue函数中添加postfilenames属性,方法部分代码如下:

      function Queue() {

            /**
             * 统计文件数。
             * * `numOfQueue` 队列中的文件数。
             * * `numOfSuccess` 上传成功的文件数
             * * `numOfCancel` 被取消的文件数
             * * `numOfProgress` 正在上传中的文件数
             * * `numOfUploadFailed` 上传错误的文件数。
             * * `numOfInvalid` 无效的文件数。
             * * `numofDeleted` 被移除的文件数。
             * * `postfilenames` 用来保存返回的文件名
             * @property {Object} stats
             */
            this.stats = {
                numOfQueue: 0,
                numOfSuccess: 0,
                numOfCancel: 0,
                numOfProgress: 0,
                numOfUploadFailed: 0,
                numOfInvalid: 0,
                numofDeleted: 0,
                numofInterrupt: 0,
                postfilenames:new Array()
            };

这个时候就可以在upload.js中的updateStatu方法中将返回的数据写入到数据库中,函数代码如下:

 function updateStatus() {
            var text = ‘‘, stats;
            if ( state === ‘ready‘ ) {
                text = ‘选中‘ + fileCount + ‘张图片,共‘ +
                        WebUploader.formatSize( fileSize ) + ‘。‘;
            } else if ( state === ‘confirm‘ ) {
                stats = uploader.getStats();
                if (stats.uploadFailNum) {
                    text = ‘已成功上传‘ + stats.successNum+ ‘张照片,‘+
                        stats.uploadFailNum + ‘张照片上传失败,<a class="retry" href="#">重新上传</a>失败图片或<a class="ignore" href="#">忽略</a>‘
                }
            } else {
                stats = uploader.getStats();
                AddImageInfo(stats);//自己添加的函数,将图片信息写入到数据库
                text = ‘共‘ + fileCount + ‘张(‘ +
                        WebUploader.formatSize( fileSize )  +
                        ‘),已上传‘ + stats.successNum + ‘张‘;

                if ( stats.uploadFailNum ) {
                    text += ‘,失败‘ + stats.uploadFailNum + ‘张‘;
                }
            }
            $info.html( text );
        }

自己定义了一个函数用于将数据保存在在数据库中,这里用的是ajax和webservice写入到数据库中的,函数代码如下:

        //将图片信息写入到数据库
        function AddImageInfo(stats)
        {         for (var i = 0;i<stats.postfilenames.length;i++){
                var serverUrl = "http://localhost:8888/XXXXX.asmx";
                $.ajax({
                    type: ‘POST‘,
                    url: serverUrl + ‘/XXXXXX‘,
                    data: ‘{ stationAttas:‘ + stats[i].postfilenames[i] + ‘}‘,
                    datatype: "json",
                    headers: {
                        "Content-Type": "application/json"
                    },
                    success:
                     function (data) {//调用服务成功后返回的数据
                         alert(data);
                     },
                    error: function (XMLHttpRequest, textStatus) {
                        alert("XMLHttpRequest.state:" + XMLHttpRequest.state + "-XMLHttpRequest.readyState:" + XMLHttpRequest.readyState + "-textStatus:" + textStatus + "-XMLHttpRequest.responseText:" + XMLHttpRequest.responseText);
                    }
                })           }
        }

这样就把一个图片上传的功能实现了。另外一个随笔会介绍如何管理上传的图片。

最近在也在做ArcGIS For Js 的缓冲区查询功能功能,里面也有和一样的功能,顺便记录一下。

在使用缓冲区查询的时候,执行execute函数是,错误函数会弹出如下图所示的提示:

这个是因为:query.geometry是个多边形(含有的point多)导致的web service的url的参数个数大于2048个,而我们这里采用的是get方式(最大的字符数为2048)不是post方式,需要proxy.ashx做处理,需要两个文件proxy.ashx和proxy.config,两个文件需要放在IIS中。在调用查询函数前加入下面两句代码即可。

  esriConfig.defaults.io.proxyUrl = "http://localhost/proxy.ashx";
  esriConfig.defaults.io.alwaysUseProxy = false;

proxy.config代码如下:

<ProxyConfig mustMatch="true">
  <serverUrls>
    <!-- serverUrl options:
            url = location of the ArcGIS Server, either specific URL or stem
            matchAll = true to forward any request beginning with the url
            token = (optional) token to include for secured service
    -->
    <serverUrl url="http://localhost:6080/arcgis/rest/services/Findtask/MapServer/0"
  matchAll="true"
  token=""></serverUrl>
    <serverUrl url="http://localhost:6080/arcgis/rest/services/Findtask/MapServer/0"
              matchAll="true"
              token=""></serverUrl>
    <serverUrl url="http://localhost:6080/arcgis/rest/services/Findtask/MapServer/0"
               matchAll="true"></serverUrl>
    <serverUrl url="http://localhost:6080/arcgis/rest/services/Findtask/MapServer/0"
               matchAll="true"></serverUrl>
  </serverUrls>
</ProxyConfig>
时间: 2024-10-29 19:08:31

Jquery图片上传功能整理的相关文章

FLASH图片上传功能—从百度编辑器UEditor里面提取出来

为了记录工作中碰到的各种问题,以及学习资料整理,今天开始,将以往的文章进行了一个整理,以后也开始认真的记录学习过程中的各种问题 在HTML里面的文件上传功能一直是个问题,为了实现上传文件大小限制,怎样显示进度条问题,以及上传前图片预览,也试过各种办法,直到有一天看到百度编辑器中的图片上传功能.花了点功夫把他单独提取出来. 最终效果图如下: 这个功能可以提供多个图片文件选择,预览,然后对上传的图片在上传队列中删除,以及旋转和,上传中进度条显示,以及上传相册的选择. 源代码下载路径为: http:/

megapix-image插件 使用Canvas压缩图片上传 解决手机端图片上传功能的问题

最近在弄微信端的公众号.订阅号的相关功能,发现原本网页上用的uploadify图片上传功能到手机端有的手机类型上就不能用了,比如iphone,至于为啥我想应该不用多说了吧(uploadify使用flash实现上传的): 经过研究找到了一个手机端比较相对比较好用的插件实现图片上传,那就是megapix-image插件,比uploadify还是好用多了,下面就来上实例吧: html页面: <html> <body> <input type="file" cap

jquery 图片上传本地预览V1.2

基于JQUERY扩展,图片上传预览插件 目前兼容浏览器(IE 谷歌 火狐) 不支持safari 代码进行小小的压缩 如果看源码 自己解压就行了 版本已升级  修复jquery版本问题  支持任意jquery版本 代码在线演示地址:http://jquery.decadework.com/ 插件下载地址:http://jquery.decadework.com/plugin/uploadPreview.zip 标签: <无> 代码片段(3)[全屏查看所有代码] 1. [代码]uploadPrev

drupal中安装CKEditor文本编辑器,并配置图片上传功能 之 方法二

drupal中安装CKEditor文本编辑器,并配置图片上传功能 之 方法一 中介绍了ckeditor的安装和配置方法,其实还有另一种新方法,不用IMCE模块. 不过需要ckfinder的JS库,可以到http://ckfinder.com/download下载,下载后放到ites\all\modules\contrib\ckeditor文件夹下如图, 然后到admin/config/content/ckeditor/edit/Full配置一下 就行了

淘淘商城图片上传功能的实现

前提: 参考:集群环境下图片上传的功能分析.vmware的安装,linux的安装.nginx和ftp服务在linux的安装,ftp的客户端的使用. 图片上传是图片存储到ftp服务器上面,所以这里不需要操作mapper层. 这里用了几个工具类 ftp图片上传的工具类,图片名字的一种新的生成方式,json与java类的转换工具. 这里图片上传采用的是富文本编辑器的一个图片上传插件,在jsp页面实现的. http://kindeditor.net/docs/upload.html 根据这几个jsp页面

jQuery图片上传前先在本地预览

/**名称:图片上传本地预览插件 v1.1*作者:周祥*时间:2013年11月26日*介绍:基于JQUERY扩展,图片上传预览插件 目前兼容浏览器(IE 谷歌 火狐) 不支持safari*插件网站:http://keleyi.com/keleyi/phtml/image/16.htm*参数说明: Img:图片ID;Width:预览宽度;Height:预览高度;ImgType:支持文件类型;Callback:选择文件显示图片后回调方法;*使用方法: <div><img id="I

jQuery图片上传前先在本地预览(不经过后端处理)

前段时间遇到一个问题,前端想实现图片上传预览(不经过后端PHP或JAVA处理),用户点击file按钮上传文件,点击确定马上就能看到预览的效果,但在实现的时候无论怎样都取不到file上图片的真实路径,得到的反而是C:\fakepath\a.jpg,这个路径是错误的.百度之后得到说浏览器基于保护用户的相关安全措施,隐藏了上传的真实路径,用fakepath代替,当然,调整浏览器的相关安全设置可以解决这个问题.但我们不可能让所有用户都通过设置浏览器的安全设置来进行图片上传,这种方法在网络交互上显然不现实

数往知来 JQuery 图片上传_水印 &lt;二十二&gt;

一.图片上传  :enctype='multipart/form-date 首先在进行文件上传时,添加form表单中的enctype属性指定enctype='multipart/form-date', 文件数据发送给服务端,并不是把文件路径发送给服务端了,它会随机生成一个分割字符串, 把每一个表单元素分割开 <form method='post' action='' enctype='multipart/form-date'> //这里的enctype是提交请求报文的报文体的一种编码格式, 默

android之使用GridView+仿微信图片上传功能(附源代码)

由于工作要求最近在使用GridView完成图片的批量上传功能,我的例子当中包含仿微信图片上传.拍照.本地选择.相片裁剪等功能,如果有需要的朋友可以看一下,希望我的实际经验能对您有所帮助. 直接上图,下面的图片就是点击"加号"后弹出的对话框,通过对话框可以根据自己需求进行相片选择. 项目结构: 下面直接上代码. 整体的布局文件activity_main.xml 1 <LinearLayout xmlns:android="http://schemas.android.co