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" ...
随机推荐
- [SharePoint 2013] Set value for people editor with JSOM
function PeoplePicker() { this.context = null; this.web = null; this.currentUser = null; this.parent ...
- CentOS 7中防火墙 firewall-cmd命令
在 CentOS 7 iptable 防火墙已经被 firewall替代 1.暂时开放FTP服务 firewall-cmd --add-service=ftp 2.永久开放FTP服务 firewall ...
- Ubuntu Dev Box Setup
Editor VIM Sublime Atom Visual Studio Code SSH Client PAC Manager File Manager Double Commander Imag ...
- Apache2.4开启GZIP功能
HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术.大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度.这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的 ...
- 解决jquery mobile的header和footer在点击屏幕的时候消失的办法
给header和footer添加 data-position="fixed" 和 data-tap-toggle="false"即可,代码如下: <div ...
- 用node-inspector调试Node.js(转自NOANYLOVE'S BLOG)
原文地址:http://www.noanylove.com/2011/12/node-the-inspector-debugging-node-js/ 用node-inspector调试Node.js ...
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数014,tuple,元组
<zw版·Halcon-delphi系列原创教程> Halcon分类函数014,tuple,元组 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“p ...
- WdatePicker 没有权限 不能执行已释放 Script 的代码
提示 拒绝访问 或 没有权限 或 ' Window.document 或 '$dp' 为空或不是对象 $dp.dd is undefined 之类的错误 SCRIPT70: 没有权限 WdatePic ...
- .NET开发者必备的工具箱
本文作者Spencer是一名专注于ASP.NET和C#的程序员,他列举了平时工作.在家所使用的大部分开发工具,其中大部分工具都是集中于开发,当然也有一些其它用途的,比如图片处理.文件压缩等. 如果你是 ...
- iOS 图片的按照比例拉伸
// 这是一个UIImage 的分类 ( UIImage+Extension.h ) UIImage+Extension.h #import <UIKit/UIKit.h> @int ...