使用Ajax上传图片到服务器(不刷新页面)

有时候我们需要上传图片时不刷新页面,那么Ajax就是很好的东西哦。之前在网上找了很多的资料都不对,不是这里就是那里错,这是本人亲自测试了的哈,是没有问题的,若有不足之处希望指正。我用的.net,对了这里还需要引用Jquery跟Jquery.form.js两个文件,没看到上传附件在哪里咯,需要的朋友可以给我留言哈

前台代码 Default2.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>

<!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 runat="server">
    <title></title>
    <script src="admin/js/jquery.js" type="text/javascript"></script>
    <script src="admin/js/jquery.form.js" type="text/javascript"></script>
    <script type="text/javascript">
        function TajaxFileUpload() {
            var imgname = $.trim($("#File1").val());
            if (imgname != "") {
                $("#form1").ajaxSubmit({
                    success: function (html, status) {
                        if (status == "success") {
                            var json = eval(‘(‘ + html + ‘)‘);
                            if (json.state == "success") {                            //上传成功
                                alert("上传成功!");
                            }
                            else {
                                alert(json.msg + "上传失败!");
                            }
                        }
                    },
                    error: function (error) {
                        alert(error);
                    },
                    url: ‘admin/ajax/upload.ashx‘, /*设置post提交到的页面*/
                    type: "post", /*设置表单以post方法提交*/
                    dataType: "text" /*设置返回值类型为文本*/
                });
            }
            else {
                alert("请上传图片!");
                return false;
            }
        }

    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <input id="File1" type="file" name="picture" />
        <input type="button" value="上 传" onclick="TajaxFileUpload()" />
    </div>
    </form>
</body>
</html>

Ajax页面代码 upload.ashx

<%@ WebHandler Language="C#" Class="upload" %>

using System;
using System.Web;
using System.IO;
using System.Text;
using System.Net;

public class upload : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";
        try
        {
            string time = DateTime.Now.ToString("yyyyMMdd").Trim();
            string fileName = time;

            HttpPostedFile pic = context.Request.Files["picture"];
            string foldPath = HttpContext.Current.Server.MapPath("~/UploadFile/") + fileName+"\\";
            //foldPath = foldPath + fileName;
            DirectoryInfo di = new DirectoryInfo(foldPath);
            if (!di.Exists)//如果文件夹目录不存在
            {
                di.Create();//新建文件夹
            }
            string imageName = UpLoadImage(pic, foldPath);
            context.Response.Write("{state:‘success‘,msg:‘上传成功:" + imageName + "‘}");

        }
        catch (Exception ex)
        {
            context.Response.Write("{state:‘error‘,msg:‘" + ex.Message + "‘}");
        }
    }
    #region 上传图片
    /// <summary>
    /// 上传图片
    /// </summary>
    /// <param name="imgfile">文件http流</param>
    /// <param name="nowpath">所需放置的文件路径</param>
    /// <returns>上传成功,返回字符串,否则,抛出异常</returns>
    public static string UpLoadImage(HttpPostedFile imgfile, string nowpath)
    {
        try
        {
            string serverPath = System.Web.HttpContext.Current.Server.MapPath("~");

            string toFilePath = Path.Combine(serverPath, nowpath);

            //获取要保存的文件信息
            FileInfo file = new FileInfo(imgfile.FileName);
            //获得文件扩展名
            string fileNameExt = file.Extension;

            //验证合法的文件
            if (CheckImageExt(fileNameExt))
            {
                //生成将要保存的随机文件名
                string fileName = DateTime.Now.ToString("yyyyMMddHHmmss").Trim() + fileNameExt;

                //获得要保存的文件路径
                string serverFileName = toFilePath +fileName;
                //物理完整路径
                string toFileFullPath = serverFileName; //HttpContext.Current.Server.MapPath(toFilePath); 

                //将要保存的完整文件名
                string toFile = toFileFullPath;//+ fileName; 

                ///创建WebClient实例
                WebClient myWebClient = new WebClient();
                //设定windows网络安全认证   方法1
                myWebClient.Credentials = CredentialCache.DefaultCredentials;
                ////设定windows网络安全认证   方法2
                imgfile.SaveAs(toFile);

                string relativePath = fileName;
                return relativePath;
            }
            else
            {
                throw new Exception("文件格式非法,请上传gif|jpg|bmp|png格式的文件。");
            }
        }
        catch
        {
            throw;
        }
    }
    #endregion

    #region 图片上传格式和文件名
    /// <summary>
    /// 检查是否为合法的上传图片
    /// </summary>
    /// <param name="_fileExt"></param>
    /// <returns></returns>
    public static bool CheckImageExt(string _ImageExt)
    {
        string[] allowExt = new string[] { ".gif", ".jpg", ".jpeg", ".bmp", ".png" };
        for (int i = 0; i < allowExt.Length; i++)
        {
            if (string.Compare(allowExt[i], _ImageExt, true) == 0)
            { return true; }
        }
        return false;

    }
    private static string GetImageName()
    {
        Random rd = new Random();
        StringBuilder serial = new StringBuilder();
        serial.Append(DateTime.Now.ToString("yyyyMMddHHmmssff"));
        serial.Append(rd.Next(0, 999999).ToString());
        return serial.ToString();

    }

    #endregion

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

}

最后上传的图片的保存路径效果图如下:

时间: 2024-10-08 23:12:54

使用Ajax上传图片到服务器(不刷新页面)的相关文章

采用AJAX + history api做无刷新页面的分页

大家都知道浏览器有一个history对象是用来保存浏览历史的,比如一个窗口访问了两个个页面,那么history.length属性等于2. history api在H5时代新增了两个方法,pushState和replaceState 从名字就可以知道一个是新增一条记录一个是改变当前那么记录. 用AJAX加history做分页的好处就是既提高了用户体验,支持前进后退,加快页面加载速度又对搜索引擎十分友好 首先我们来判断浏览器是否支持pushState/replaceState if(!!(windo

确认框的使用。弹出一个确认框,Ajax提交一个请求,刷新页面。

视图: <td> @if (item.ReviewProject.DeclareState == DeclareOrReviewState.正在进行 && !item.IsSubmit) { @Html.ActionLink("编辑", "Edit", new { id = item.ApplicationProjectID }) <text> |</text> @Html.ActionLink("删除&

Ajax请求数据与删除数据后刷新页面

1.ajax异步请求数据后填入模态框 请求数据的按钮(HTML) <a class="queryA" href="javascript:void(0)" onclick="query(${register.id})"> <span class="glyphicon glyphicon-search"></span></a>  ajax异步请求数据后给id为queryInfo的模态

基于jQuery的ajax系列之用FormData实现页面无刷新上传

接着上一篇ajax系列之用jQuery的ajax方法向服务器发出get和post请求写,这篇主要写如何利用ajax和FormData实现页面无刷新的文件上传效果,主要用到了jQuery的ajax()方法和XMLHttpRequest Level 2的FormData接口.关于FormData,大家可以看MDN文档. 1,先看效果图 期望的功能和效果很简单:点击页面中的上传文件表单控件,选择文件后点击"ajax提交",将文件上传至服务器,上传成功后,页面给出一个简单的提示. 2,前端的代

Ajax回退刷新页面问题的解决办法

在脚本之家看到一篇文章,觉得以后可能会用上,但是竟然不能收藏,所以只能将其转到博客园. 以下是原文地址: http://www.jb51.net/article/87856.htm 这篇文章主要介绍了Ajax回退刷新页面问题的解决办法的相关资料,非常不错,具有参考借鉴价值,感兴趣的朋友一起学习吧 Ajax 简介: AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. AJAX = 异

浏览器刷新页面后向服务器发出两次请求的问题

1.1.1 现象 在IE和FireFox下刷新页面,发现服务器接收到两次相同的请求. 1.1.2 原因 经过验证,发现是页面中包含了如下代码: <img src=\'#\'" /> 此处src为空字符串,浏览器会认为src指向的是当前页面,由于img元素是根据src来获得图片数据的,因此当浏览器第一次请求后显示页面,在解析到此处时将会产生第二次相同请求. 在开发中src临时为空的情况还是比较常见,当出现服务器接收到多次相同请求时,可以想想是否是这种原因. 1.1.3 解决 确保img

解决Ajax.BeginForm还是刷新页面的问题

在.net mvc中用Ajax.BeginForm来实现异步提交,在Ajax.BeginForm里面还是可以用submit按钮,一般来说 submit按钮是提交整个页面的数据.但是在Ajax.BeginForm里面使用submit,提交的也只是当前Ajax.BeginForm里面的数据.不过在使用这个东西的时候遇到个问题,就是点击submit按钮,也还是刷新页面了,这时突然感觉Ajax.BeginForm就是个没用的东西.后来想想,不对啊,既然能叫Ajax.BeginForm,那么肯定能够局部刷

AjAX请求后台,无刷新更新页面

$(function () {        $('#按钮ID').click(function () { $.ajax({                url: '请求地址',                data: '传递参数',                datatype: 'text/plain',//请求类型                success: function (返回参数) {                    if (result == "1")

JSF中使用f:ajax标签无刷新页面改变数据

ajax本是用在前端的一种异步请求数据的操作,广泛用于js中,一般的js框架如jq都有被封装好的方法,用于发起异步请求操作.异步操作可以增强用户体验和操作,越来越多的程序都在使用ajax.JSF的facelets内置了一个ajax标签,可用于简单的ajax操作. f:ajax 有几个常用属性,分别是:event.listener.render. 1.event:event 对应一个js事件名,该事件名省略了开头的”on“字符,例如点击事件是onclick,那么只需要填入click即可.类似事件还