jQuery ajax + ajaxfileupload.js插件 实现无刷新文件上传

时间:2022-01-13 13:08:51

jQuery ajax + ajaxfileupload.js插件 实现无刷新文件上传


这里以上传图片为例,其它多媒体文件类似

==== aspx 页面部分代码如下 =====

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="InfoEdit.aspx.cs" Inherits="Admin.InfoEdit" %>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>编辑信息</title>
<script src="/Js/jquery-1.11.0.min.js" type="text/javascript"></script>
<script src="/Js/ajaxfileupload.js" type="text/javascript"></script>
</head>
<body>
<!--<form id="form1"> 带不带下面的enctype都可以,推荐带上-->
<form id="form1"  enctype="multipart/form-data">        <div>            <table>                <tr>                    <td><em class="red">*</em>下载地址                    </td>                    <td align="left">                        <input id="PicFile" name="PicFile" type="file" class="w200" /> 路径<input id="FilePath" type="text" class="w200" value="" readonly="true" /> 大小<input id="FileSize" type="text" class="w200" value="" readonly="true" /> <input type="button" id="buttonUplod" class="w200" value="上传" />                    </td>                </tr>                <tr>                    <th></th>                    <th align="left" style="padding: 20px;">                        <input type="button" value=" 保存 " id="btnOk" />                        <input type="button" value=" 取消 " style="margin-left: 50px;" id="btnCancel" />                    </th>                </tr>            </table>        </div>    </form>    <script type="text/javascript">        $(document).ready(function () {            GetData();            $("#btnOk").click(function () {                DataEdit();            });            $("#btnCancel").click(function () {                window.location.href = "Infos.aspx";            });        });        function GetData() {            var id = getQueryString("id") || 0;            if (id == 0) {                return;            }            var data = {};            data.method = "GetData";            data.id = id;            ajaxProcess("/InfoEdit.aspx?", data, function callSuccess(oRet) {                var result = oRet.Result[0];                if (result != null) {                    $("#FilePath").val(result.Url);                }            }, function callError(e) {                alert(e);            });        }        function DataEdit() {                        var id = getQueryString("id") || 0;            var size = $("#FileSize").val();            var picPath = $("#FilePath").val();                       if (!picPath) {                showDialog("没有上传文件");                return;            }                        var data = {};            data.method = "DataEdit";            data.id = id,            data.size = size;            data.contents = contents;            data.picfile = picPath;            ajaxProcess("?", data, function (oRet) {                if (oRet.Error || oRet.Result < 0) {                    showDialog(oRet.Error || "操作失败");                    return;                }                showDialog("操作成功", 1, 0, "提示", function () {                    window.location.href = "Infos.aspx";                });            }, function (ex) { alert(ex); });        }    </script>    <script type="text/javascript">            $("#buttonUplod").click(function () {                $.ajaxFileUpload({                    url: 'Audioupload.aspx?type=2', //你处理上传文件的服务端 type=1 sys sound type=2 info                    secureuri: false, //与页面处理代码中file相对应的ID值                    fileElementId: 'PicFile',                    dataType: 'json', //返回数据类型:text,xml,json,html,scritp,jsonp五种                    success: function (data) {                        //alert(data.path);                        $("#FilePath").val(data.path);                        $("#FileSize").val(data.size);                        if (data.status == "error") {                            alert(data.msg);                        }                    }                });            });    </script></body></html>

====== Picupload.aspx 文件如下  =====

using System;
using System.Configuration;
using System.Drawing;
using System.IO;
using System.Web;
using Admin.App_Codes;
using Utility;

namespace Admin
{
public partial class Picupload : PageBase
{
protected override void OnInit(EventArgs e)
{
PowerPageId = 10034;
base.OnInit(e);
}

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
try
{
var type = Request["type"];
if (Request.UrlReferrer==null || Request.UrlReferrer.ToString().Length < 1 || type==null)
{
Response.Write("该页面不能直接访问");
Response.End();
}

var infoPicPath = ConfigurationManager.AppSettings["InfoPicPath"].ToString();

if (type == "2")
{
Upload(infoPicPath);
}

}
catch (Exception ex)
{
var response = "{\"status\" : \"error\", \"msg\": " + "\"" + ex.Message.ToString() + "\"}";
Response.Write(response);
Response.End();
}
}
}

private void Upload(string picPath)
{
var response = "";

try
{
HttpFileCollection files = Request.Files;
if (files.Count > 0)
{
HttpPostedFile file = files[0];


string tmpPath = Server.MapPath(picPath);
string fileName = Path.GetFileName(file.FileName);


var isSafe = PicCheck(file);

if (isSafe)
{
file.SaveAs(tmpPath + fileName);
//response = "{\"status\" : \"success\", \"path\": " + "\"" + picPath + fileName + "\"}";
response = "{\"status\" : \"success\", \"path\": " + "\"" + picPath + fileName + "\",\"size\": " + "\"" + file.ContentLength + "\"}";
}
else
{
response = "{\"status\" : \"error\", \"msg\": " + "\"图片格式不对或大小超限\"}";
}

Response.Clear();
Response.Write(response);
}
}
catch (Exception ex)
{
response = "{\"status\" : \"error\", \"msg\": " + "\"" + ex.Message.ToString() + "\"}";
Response.Write(response);
Response.End();
}
}

private bool PicCheck(HttpPostedFile picFile)
{
var isSafe = false;
var picMaxSize = ConfigurationManager.AppSettings["PicMaxSize"].ToString().ToInt32();
string fileName = Path.GetFileName(picFile.FileName);

string picext = Path.GetExtension(fileName).ToLower();

if (picext == ".jpg" || picext == ".gif" || picext == ".bmp" || picext == ".png")
{
isSafe = true;
}
else
{
isSafe = false;
return isSafe;
}

if (picFile.ContentLength < picMaxSize)
{
isSafe = true;
}
else
{
isSafe = false;
return isSafe;
}

//图片尺寸检查
Stream picstream = picFile.InputStream;
Image img = Image.FromStream(picstream);
if (img.Width > 0 && img.Height > 0)
{
isSafe = true;
//picstream.Close();
//picstream.Flush();
}
else
{
isSafe = false;
//picstream.Close();
//picstream.Flush();
}
return isSafe;
}
}
}

===== ajaxfileupload.js 文件如下 ====

ajaxfileupload.js

jQuery.extend({
createUploadIframe: function (id, uri) {
//create frame
var frameId = 'jUploadFrame' + id;
if (window.ActiveXObject) {
var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />');
if (typeof uri == 'boolean') {
io.src = 'javascript:false';
}
else if (typeof uri == 'string') {
io.src = uri;
}
}
else {
var io = document.createElement('iframe');
io.id = frameId;
io.name = frameId;
}
io.style.position = 'absolute';
io.style.top = '-1000px';
io.style.left = '-1000px';

document.body.appendChild(io);

return io
},
createUploadForm: function (id, fileElementId) {
//create form
var formId = 'jUploadForm' + id;
var fileId = 'jUploadFile' + id;
var form = $('<form action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"></form>');
var oldElement = $('#' + fileElementId);
var newElement = $(oldElement).clone();
$(oldElement).attr('id', fileId);
$(oldElement).before(newElement);
$(oldElement).appendTo(form);
//set attributes
$(form).css('position', 'absolute');
$(form).css('top', '-1200px');
$(form).css('left', '-1200px');
$(form).appendTo('body');
return form;
},
addOtherRequestsToForm: function (form, data) {
// add extra parameter
var originalElement = $('<input type="hidden" name="" value="">');
for (var key in data) {
name = key;
value = data[key];
var cloneElement = originalElement.clone();
cloneElement.attr({ 'name': name, 'value': value });
$(cloneElement).appendTo(form);
}
return form;
},

ajaxFileUpload: function (s) {
// TODO introduce global settings, allowing the client to modify them for all requests, not only timeout
s = jQuery.extend({}, jQuery.ajaxSettings, s);
var id = new Date().getTime()
var form = jQuery.createUploadForm(id, s.fileElementId);
if (s.data) form = jQuery.addOtherRequestsToForm(form, s.data);
var io = jQuery.createUploadIframe(id, s.secureuri);
var frameId = 'jUploadFrame' + id;
var formId = 'jUploadForm' + id;
// Watch for a new set of requests
if (s.global && !jQuery.active++) {
jQuery.event.trigger("ajaxStart");
}
var requestDone = false;
// Create the request object
var xml = {}
if (s.global)
jQuery.event.trigger("ajaxSend", [xml, s]);
// Wait for a response to come back
var uploadCallback = function (isTimeout) {
var io = document.getElementById(frameId);
try {
if (io.contentWindow) {
xml.responseText = io.contentWindow.document.body ? io.contentWindow.document.body.innerHTML : null;
xml.responseXML = io.contentWindow.document.XMLDocument ? io.contentWindow.document.XMLDocument : io.contentWindow.document;
} else if (io.contentDocument) {
xml.responseText = io.contentDocument.document.body ? io.contentDocument.document.body.innerHTML : null;
xml.responseXML = io.contentDocument.document.XMLDocument ? io.contentDocument.document.XMLDocument : io.contentDocument.document;
}
} catch (e) {
jQuery.handleError(s, xml, null, e);
}
if (xml || isTimeout == "timeout") {
requestDone = true;
var status;
try {
status = isTimeout != "timeout" ? "success" : "error";
// Make sure that the request was successful or notmodified
if (status != "error") {
// process the data (runs the xml through httpData regardless of callback)
var data = jQuery.uploadHttpData(xml, s.dataType);
// If a local callback was specified, fire it and pass it the data
if (s.success)
s.success(data, status);
// Fire the global callback
if (s.global)
jQuery.event.trigger("ajaxSuccess", [xml, s]);
} else
jQuery.handleError(s, xml, status);
} catch (e) {
status = "error";
jQuery.handleError(s, xml, status, e);
}


// The request was completed
if (s.global)
jQuery.event.trigger("ajaxComplete", [xml, s]);


// Handle the global AJAX counter
if (s.global && ! --jQuery.active)
jQuery.event.trigger("ajaxStop");

// Process result
if (s.complete)
s.complete(xml, status);
jQuery(io).unbind()

setTimeout(function () {
try {
$(io).remove();
$(form).remove();
} catch (e) {
jQuery.handleError(s, xml, null, e);
}
}, 100)
xml = null
}
}
// Timeout checker
if (s.timeout > 0) {
setTimeout(function () {
// Check to see if the request is still happening
if (!requestDone) uploadCallback("timeout");
}, s.timeout);
}
try {
// var io = $('#' + frameId);
var form = $('#' + formId);
$(form).attr('action', s.url);
$(form).attr('method', 'POST');
$(form).attr('target', frameId);
if (form.encoding) {
form.encoding = 'multipart/form-data';
}
else {
form.enctype = 'multipart/form-data';
}
$(form).submit();


} catch (e) {
jQuery.handleError(s, xml, null, e);
}
if (window.attachEvent) {
document.getElementById(frameId).attachEvent('onload', uploadCallback);
}
else {
document.getElementById(frameId).addEventListener('load', uploadCallback, false);
}
return { abort: function () { } };

},

uploadHttpData: function (r, type) {
var data = !type;
data = type == "xml" || data ? r.responseXML : r.responseText;
// If the type is "script", eval it in global context
if (type == "script")
jQuery.globalEval(data);
// Get the JavaScript object, if JSON is used.
if (type == "json")
eval("data = " + data);
// evaluate scripts within html
if (type == "html")
jQuery("<div>").html(data).evalScripts();
//alert($('param', data).each(function(){alert($(this).attr('value'));}));
return data;
}
})

=== end ===