ajax 无刷新上传
最近要做微信的图文上传,因为一个图文了表中可以有多个图文,所有按钮需要随时添加,所以做了一种无刷新上传的方法。
首先我们要在html页面中写上这样的几段代码
javascript:
$(function () {
//这个是为了绑定我们所有的上传按钮,包括动态添加的按钮
$(document).on("change", ".filebutton", function () {
$(this).parent().children("span").html('开始上传中....');
$(this).parent().submit();
});
})
//这个方法是为了让iframe中的页面调用修改本页内容的方法(可以根据自己需要修改)
function uploadSuccess(msg) {
var info = msg.split('|');
var _from = $("#" + info[2] + "_ts");
_from.html(info[0]);
if (info[1] != "") {
_from.append("<a href='uplod/" + info[1] + "' target=\"_blank\" imgurl=\"" + info[1] + "\">查看图片</a>");
}
else {
_from.append("<a imgurl=\"\"></a>");
}
}
html
<form method="post" action="../ajax/Upload.ashx?id=boximg" target='boximg_f' enctype="multipart/form-data"><!--这里用到了target属性来指向下面的iframe让页面在iframe中刷新-->
<input class="filebutton" type="file" id="boximg" name="fileUp" />
<span id="boximg_ts" runat="server" class="help-inline">上传的文件不能大于500KB</span>
</form> <!--这里隐藏这个iframe让别人看不出来刷新的效果-->
<iframe id="boximg_f" name="boximg_f" style="display:none;"></iframe>
然后我们需要建立这个Upload.ashx文件来接收post过来的文件数据
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using System.Net;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using WeiXinHaiBLL; namespace WeiXinHai.ajax
{
/// <summary>
/// Upload 的摘要说明
/// </summary>
public class Upload : IHttpHandler
{ public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
//string fname = context.Request.QueryString["op"].ToString();
//string str =fname+"({name:'judy',age:'23'})"; string id = context.Request.QueryString["id"];
try
{
//获取当前Post过来的file集合对象,在这里我只获取了<input type='file' name='fileUp'/>的文件控件
string file1 = "";
if (id == "citu")
{
file1 = "fileUps";
}
else
{ file1 = "fileUp"; }
HttpPostedFile file = context.Request.Files[file1];
if (file != null)
{
//当前文件后缀名
string ext = Path.GetExtension(file.FileName).ToLower();
//验证文件类型是否正确
if (!ext.Equals(".gif") && !ext.Equals(".jpg") && !ext.Equals(".png") && !ext.Equals(".bmp"))
{
//ajax/uplodereturn.html
//这里window.parent.uploadSuccess()是我在前端页面中写好的javascript function,此方法主要用于输出异常和上传成功后的图片地址
context.Response.Redirect("uplodereturn.html?error=fileerror&id=" + id, false);
return;
}
//验证文件的大小
if (file.ContentLength > ( * ))
{
//这里window.parent.uploadSuccess()是我在前端页面中写好的javascript function,此方法主要用于输出异常和上传成功后的图片地址
context.Response.Redirect("uplodereturn.html?error=tobig&id=" + id, false);
return;
}
FileInfo files = new FileInfo(file.FileName); //当前文件上传的目录
string serverPath = System.Web.HttpContext.Current.Server.MapPath("~");
string selfPath = "images\\uplod\\"; //当前待上传的服务端路径
string toFilePath = Path.Combine(serverPath, selfPath);
//生成将要保存的随机文件名
string fileName = GetImageName() + ext;
//获得要保存的文件路径
string serverFileName = toFilePath + fileName; //物理完整路径
string toFileFullPath = serverFileName; //HttpContext.Current.Server.MapPath(toFilePath); //将要保存的完整文件名
string toFile = toFileFullPath;//+ fileName; context.Request.Files[].SaveAs(toFile); //开始上传
//file.SaveAs(imageUrl);
//这里window.parent.uploadSuccess()是我在前端页面中写好的javascript function,此方法主要用于输出异常和上传成功后的图片地址
//如果成功返回的数据是需要返回两个字符串,我在这里使用了|分隔 例: 成功信息|/Test/hello.jpg
context.Response.Redirect("uplodereturn.html?type=" + fileName + "&id=" + id, false);
return;
}
else
{
//上传失败
context.Response.Redirect("uplodereturn.html?r=a&id=" + id, false);
return;
}
}
catch (Exception ex)
{
//上传失败
context.Response.Redirect("uplodereturn.html?r=a&id=" + id, false);
return;
}
//context.Response.Write("hello word")
} public bool IsReusable
{
get
{
return false;
}
} #region Private Methods
/// <summary>
/// 检查是否为合法的上传图片
/// </summary>
/// <param name="_fileExt"></param>
/// <returns></returns>
private bool CheckImageExt(string _ImageExt)
{
string[] allowExt = new string[] { ".jpg", ".png", ".bmp", ".gif", ".pdf", ".jpeg", };
for (int i = ; i < allowExt.Length; i++)
{
if (allowExt[i] == _ImageExt) { return true; }
}
return false; } private string GetImageName()
{
Random rd = new Random();
StringBuilder serial = new StringBuilder();
serial.Append(DateTime.Now.ToString("yyyyMMddHHmmssff"));
serial.Append(rd.Next(, ).ToString());
return serial.ToString(); } #endregion
}
}
剩下的我们就要新建一个用来调用ifarme父级uploadSuccess方法的页面uplodereturn.html
这个页面要和上面的一般处理程序在一个文件夹内
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script>
var url = window.location.search;
if (url.indexOf("?") != -1) {
var strurl = url.substr(1)
strs = strurl.split("&");
var returntype = '';
if ([strs[0].split("=")[0]] == 'type') {
returntype = "上传成功|" + unescape(strs[0].split("=")[1]);
//window.parent.uploadSuccess("上传成功|" + unescape(strs[0].split("=")[1]));
}
else if ([strs[0].split("=")[0]] == 'error') {
returntype = (unescape(strs[0].split("=")[1]) == "fileerror" ? "文件格式错误" : "上传文件过大,请重新上传!") + "|";
//window.parent.uploadSuccess(unescape(strs[0].split("=")[1]));
}
if (strs[1].split("=")[0] == 'id') {
returntype += "|" + unescape(strs[1].split("=")[1]);
}
window.parent.uploadSuccess(returntype);
}
</script>
</head>
<body>
</body>
</html>
然后大功告成,我们添加的时候需要添加上最上面的html代码中的form部分就可以了
这里的原理是用from 的target 来让这个from的刷新过程在iframe中进行,这样的话我们隐藏掉iframe的时候就看不出页面的刷新效果
同时我们又在这个新建的html中拼写好我们想要的参数调用父级写好的方法,然后达到更改页面的效果。
这里我的方法是修改了span部分的内容。
ajax 无刷新上传的更多相关文章
- 移动端图片上传解决方案localResizeIMG先压缩后ajax无刷新上传
现在科技太发达,移动设备像素越来越高,随便一张照片2M+,但是要做移动端图片上传和pc上略有不同,移动端你不能去限制图片大小,让用户先处理图片再上传,这样不现实.所以理解的解决方案就是在上传先进行图片 ...
- ajaxfileupload.js插件结合一般处理文件实现Ajax无刷新上传
先上几张图更直观展示一下要实现的功能.本功能主要通过Jquery ajaxfileupload.js插件结合ajaxUpFile.ashx一般应用程序处理文件实现Ajax无刷新上传功能,结合NPOI2 ...
- ajax无刷新上传和下载
关于ajax无刷新上传和下载 这是一个没什么含量但是又用的比较多又不得不说的问题,其实真的不想说,因为没什么好说的. 关于上传 1.使用Flash,ActiveX 上传 ,略... 2.自己写XMLH ...
- Ajax 无刷新上传文件插件 uploadify 的使用
在表单中无法直接使用 Ajax 上传文件,解决的思路可以是使用插件无刷新地上传文件,返回文件上传后的地址,然后把该地址作为 Ajax 的参数传递给服务器端进行数据库处理.可以使用 uploadify ...
- ajax无刷新上传
我们在使用上传控件的时候,会遇到刷新的问题,最近使用ajax做的上传,觉得效果还是很不错. 首先,我们需要在页面上放上上传控件:需要注意的是,我们必须放在form里面,实现表单上传. <for ...
- ajax无刷新上传文件
网页上传文件最简单的方式就是通过表单上传了,但是在提交表单的时候会导致网页刷新,但有的时候我们不想网页刷新,有什么办法呢,我们可以使用ajax上传文件来做到这一点.只有ajax还不行,还需要JavaS ...
- jquery 的ajax无刷新上传文件之后,页面还是会莫名的刷新-----解决办法
文件上传用到全局数组: $_FILES 只需要把下面的 <button onclick="post()">提交</button> 改为 <input ...
- jQuery.form Ajax无刷新上传错误 (jQuery.handleError is not a function) 解决方案
今天,随着ajaxfileupload时间firebug财报显示,"jQuery.handleError is not a function"错误.因为一旦使用jQuery.for ...
- jquery ajax 无刷新上传
var form = new FormData(); form.append('file', $("#submitmaterials").find("input" ...
随机推荐
- java关键字之final
final表示不能修改. final修饰的方法不能被重写, final修饰的类不能被继承并且类里的所有方法都是final,成员变量可以是final或者不是final. final修饰的成员变量不可以改 ...
- python web框架之django环境搭建
一.django环境搭建 https://www.djangoproject.com/download/ 下载适合自己的版本,在右边有压缩包版本的,也可以到git上去拽.我用的python27,下载的 ...
- windows远程控制ubuntu---基于ssh
要实现windows下连接ubuntu需要安装以下软件: 1. windows下安装winSCP 2. Ubuntu下安装OpenSSH Server 可以使用命令行安装openSSH Server: ...
- Leetcode: Find Leaves of Binary Tree
Given a binary tree, collect a tree's nodes as if you were doing this: Collect and remove all leaves ...
- 【皇甫】☀ TreeSet
-Set: 元素是无序(存入和取出的顺序不一致),元素不可以重复 |-- HashSet: 底层数据结构是哈希表 HashSet是如何保证元素的唯一性的呢? 是通过元素的两个方法,hashCode和e ...
- js基础练习二之简易日历
今天学到了js基础教程3,昨天的课后练习还没来的及做,这个是类似简易日历的小案例,视频还没听完,今晚继续...... 先看效果图: 其实做过前面的Tab选项卡,这个就很好理解了,通过鼠标放在不同月份月 ...
- java线程池ThreadPoolExecutor理解
Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.newFixe ...
- win7远程桌面连接windows2008服务器,连接启动很慢。我是这样解决的。
1.在本地链接属性中把IPv6勾选取消掉. 2.在window命令中运行 (cmd) netsh int tcp setglobal autotuninglevel=disable 祝君成功!
- EF并非我们想象的那么智能
我之前在项目中用EF读取一个视图的数据,页面展示出现重复数据,当时百思不得其解,跟踪代码,数据读取时取到的数据并不是重复,为什么在前台显示就有重复了呢,我当时就在业务层将数据去重,但取到的数据跟数据库 ...
- PhpStorm设置编码
PhpStorm是一个轻量级且便捷的PHP IDE,其旨在提供用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查. 本文为大家讲解的是如何设置phpstorm 编辑器的编码,感 ...