`
心动音符
  • 浏览: 336891 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Ajax实现文件上传

阅读更多
今天想到了ajax上传文件的问题,不知怎样解决;于是上网搜索,在网上看到了好多文章,看到有人使用Prototype上传其实使用还是基本的方式进行
的,没有使用ajax提交文件,实现方式是使用form方式提交服务器端,然后使用ajax方式到服务器端查询服务器端文件上传的进度,然后
在客户端的进度条上显示进度,没有从更本上使用ajax方式进行上传;最终了解到其实要使用ajax上传文件要在客户端先把文件
使用javascript方式读取出来然后将读取内容通过send的方式提交到服务器端,使用这种方式可能对于客户端来说不太安全,因为脚本需要有
访问客户文件系统的权限;使用ajax方式上传文件找到了2种做法(在老外的网站上找的)一种使用的是在firefox浏览器下实现的,通过
修改浏览器设置可以访问本地文件系统,然后调用浏览中一个控件方式读取文件的内容,将文件内容和文件名称等信息组合成http协议上传文件的形势
然后通过ajax的open方法和send方法提交到服务,我觉得这种方法有些局限性(现在毕竟使用firefox的用户还是不太多),不过在firefox下能够显示已经不错了;
后来通过在www.codeproject.com上找到通过使用ms系统中控件的方法来实现的方式,我把列出来以后说不定会用上哦;
客户端:
1、首先得到文件信息方法 function getFileParams()
{ 
//Convert file path to appropriate format


this.filePath = document.getElementById("file").value.replace(/\\/g, "<A>\\\\</A>");

fso = new ActiveXObject( 'Scripting.FileSystemObject' );
if ( !fso.FileExists(this.filePath) )
{
  alert("Can't open file.");
  return;
}
  
f = fso.GetFile( this.filePath );
this.fileSize = f.size;
this.fileName = f.Name;
InitStatusForm();
InitUpload();
}

2、将文件的一些信息通过ajax方式先提交到服务器端

function InitUpload()

{
document.getElementById("uploadConsole").style.display = "none";
document.getElementById("statusConsole").style.display = "block";

xmlhttp = new ActiveXObject( "Microsoft.XMLHTTP" );
xmlhttp.onreadystatechange = HandleStateChange;

var parameters = "fileSize=" + encodeURI(this.fileSize) +
"&fileName=" + encodeURI(this.fileName)+
"&overwriteFile=" + encodeURI(document.getElementById("overwriteFile").checked);

xmlhttp.open("POST","<A href="http://localhost/AJAXUpload/Upload.asmx/InitUpload">http://localhost/AJAXUpload/Upload.asmx/InitUpload<;/A>", true);


xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
xmlhttp.setRequestHeader("Content-length", parameters.length);
xmlhttp.setRequestHeader("Connection", "close");
xmlhttp.send(parameters);
}


3、在服务器端有响应后再上传真正的文件内容
function HandleStateChange() {
switch (xmlhttp.readyState) {
case 4:
   response = xmlhttp.responseXML.documentElement;
  id = response.getElementsByTagName('ID')[0].firstChild.data;
   offset = esponse.getElementsByTagName('OffSet')[0].firstChild.data;
   bufferLength = response.getElementsByTagName('BufferLength')[0].firstChild.data;
  
   percentage = (offset/this.fileSize)*100;
  if (offset<this.fileSize && !this.cancelUpload)
  {
UpdateStatusConsole(percentage, "Uploading");
SendFilePart(offset, bufferLength);
  }
  else
  {
SetButtonCloseState(false);
if (this.cancelUpload)
UpdateStatusConsole(percentage, "Canceled");
else
UpdateStatusConsole(percentage, "Complete");
  }
  break;
} 
}

4、上传文件内容的方法
function SendFilePart(offset, length)
{
// create SOAP XML document


var xmlSOAP = new ActiveXObject("MSXML2.DOMDocument");
xmlSOAP.loadXML('<?xml version="1.0" encoding="utf-8"?>'+
'<soap:Envelope xmlns:xsi="<A href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance<;/A>" '+
'xmlns:xsd="<A href="http://www.w3.org/2001/XMLSchema">http://www.w3.org/2001/XMLSchema<;/A>" xmlns:soap="<A href="http://schemas.xmlsoap.org/soap/envelope/">http://schemas.xmlsoap.org/soap/envelope/<;/A>"> '+
  '<soap:Body>'+
'<UploadData xmlns="<A href="http://tempuri.org/">http://tempuri.org/<;/A>" >'+
'<fileName>'+this.fileName+'</fileName>'+
'<fileSize>'+this.fileSize+'</fileSize>'+
'<file></file>'+
'</UploadData>'+
  '</soap:Body>'+
'</soap:Envelope>');

// create a new node and set binary content


var fileNode = xmlSOAP.selectSingleNode("//file");
fileNode.dataType = "bin.base64";
// open stream object and read source file


if (adoStream.State != 1 )
{
   adoStream.Type = 1; // 1=adTypeBinary 


   adoStream.Open(); 
   adoStream.LoadFromFile(this.filePath);
}

adoStream.Position = offset;
// store file content into XML node


fileNode.nodeTypedValue = adoStream.Read(length);//adoStream.Read(-1); // -1=adReadAll


if (adoStream.EOS)
{
  //Close Stream


   adoStream.Close();
}

// send XML document to Web server


xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.onreadystatechange = HandleStateChange;
xmlhttp.open("POST", "<A href="http://localhost/AJAXUpload/Upload.asmx">http://localhost/AJAXUpload/Upload.asmx<;/A>", true);


xmlhttp.setRequestHeader("SOAPAction", "<A href="http://tempuri.org/UploadData">http://tempuri.org/UploadData<;/A>");


xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xmlhttp.send(xmlSOAP);
}

通过使用ADODB.Stream控件来实现文件的读取,将文件内容封装到了xml文件将xml文件上传到服务器端
以下是服务器端的代码:
[WebMethod] 
public XmlDocument InitUpload(int fileSize, string fileName, bool overwriteFile )
{
long offset = 0;
string filePath = GetFilePath(fileName);

if (File.Exists(filePath))
{
  if (overwriteFile)
  {
File.Delete(filePath);
  }
  else
  {
using (FileStream fs = File.Open(filePath, FileMode.Append)) 
{
offset = fs.Length;
}
  }
}

return GetXmlDocument(Guid.NewGuid(), string.Empty, offset, 
(InitialBufferLength+offset)>fileSize?(int)(fileSize-offset):InitialBufferLength);
}

public XmlDocument UploadData(string fileName, int fileSize, byte[] file)
{
if (fileName == null || fileName == string.Empty || file == null)
  return GetXmlDocument(Guid.NewGuid(), "Incorrect UploadData Request", 0, 0);

string filePath = GetFilePath(fileName);

long offset=0;
using (FileStream fs = File.Open(filePath, FileMode.Append)) 
{
   fs.Write(file, 0, file.Length);
   offset = fs.Length;
}
return GetXmlDocument(Guid.NewGuid(), string.Empty, offset, 
(InitialBufferLength+offset)>fileSize?(int)(fileSize-offset):InitialBufferLength);
}
 
分享到:
评论

相关推荐

    ajax实现文件上传

    ### AJAX 实现文件上传 在探讨 AJAX 如何实现文件上传之前,我们首先简要回顾一下 AJAX 的历史背景及其带来的变革。AJAX(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下,能够更新部分...

    ajax实现文件上传源码

    ### 二、Ajax实现文件上传原理 Ajax文件上传主要涉及HTML、JavaScript(jQuery库常用)、XMLHttpRequest对象和服务器端处理。以下为基本步骤: 1. **创建HTML表单**:创建一个包含文件输入控件的HTML表单,设置`...

    jquery+ajax实现文件上传的js

    本文将深入探讨如何利用jQuery和AJAX实现文件上传,并重点介绍`ajaxfileupload.js`这个jQuery插件。 首先,jQuery是一个轻量级的JavaScript库,它简化了DOM操作、事件处理和Ajax交互等任务。而AJAX(Asynchronous ...

    Ajax实现文件上传进度条

    下面将详细讲解如何利用Ajax实现文件上传进度条。 首先,我们需要理解Ajax的基本原理。Ajax(Asynchronous JavaScript and XML)是一种创建动态网页的技术,通过在后台与服务器进行少量数据交换,使得网页实现异步...

    jsf+ajax实现文件上传

    jsf结合ajax实现文件上传,值得阅读

    在Web API中使用jQuery AJAX实现文件上传的例子

    这个例子展示了如何在ASP.NET Web API中使用jQuery AJAX实现文件上传的基本流程。客户端通过AJAX发送文件到服务器,服务器接收文件并进行相应的处理。注意,实际应用中还需要考虑错误处理、文件大小限制、安全问题...

    【JavaScript源代码】jQuery+ajax实现文件上传功能.docx

    ### 使用jQuery与Ajax实现文件上传功能(含上传进度显示) #### 概述 本文将详细介绍如何利用jQuery和Ajax技术来实现文件上传的功能,并且能够实时显示文件上传的进度。此功能在很多应用场景下非常实用,比如用户...

    基于ajax实现文件上传并显示进度条

    下面给大家分享下基于ajax实现文件上传并显示进度条。在jsp部分,需要设计一个表单,form的属性添加 enctype=”multipart/form-data”,设计一个iframe,作为隐藏。form的target等于iframe的name; 在servlet部分:...

    使用ajax实现多文件上传

    使用普通表单的input框,引入多文件上传插件,传报文格式的参数,表单内容同时提交

    SpringMVC+Ajax异步文件上传

    在本教程中,我们将探讨如何结合`SpringMVC`和`Ajax`来实现异步文件上传,并讨论短视频背景以及`a`标签绑定文件域的相关知识。 1. **SpringMVC中的文件上传** - **MultipartFile接口**:`SpringMVC`提供了一个名为...

    ajax实现java文件下载

    本话题将详细探讨如何通过Ajax实现Java文件的下载,并介绍相关的核心概念和技术。 1. **Ajax**(Asynchronous JavaScript and XML)是一种在不重新加载整个网页的情况下,能够更新部分网页的技术。它通过JavaScript...

    php+AJAX实现文件上传系统

    本项目采用PHP作为后端处理语言,配合前端的AJAX技术,实现了文件管理的一系列功能,如新建目录、文件上传与下载、文件重命名以及删除。下面将详细阐述这些功能的实现原理和步骤。 **1. PHP基础** PHP是一种广泛...

    AJAX实现基于WEB的文件上传的进度控制源代码

    4. **AJAX实现文件上传**: - 首先,创建一个`&lt;input type="file"&gt;`元素让用户选择文件。 - 然后,使用JavaScript获取选中的文件,并创建一个`FormData`对象。 - 将文件添加到`FormData`对象,设置HTTP请求头,如...

    大文件上传, ajax 实现, 支持10G以上的上传

    本教程将基于标题“大文件上传,ajax实现,支持10G以上的上传”和描述,详细介绍如何使用AJAX实现大文件上传,并探讨其背后的原理和技巧。 首先,理解大文件上传的关键在于分块上传。当文件过大时,一次性上传整个...

    使用ajax实现上传文件的功能

    在IT开发领域,使用AJAX实现文件上传功能是一项常见的需求。AJAX(Asynchronous JavaScript and XML)允许网页在不需要重新加载整个页面的情况下,与服务器交换数据并更新部分网页内容。文件上传则允许用户选择文件...

    ssm整合+ajaxUpload文件上传

    AjaxUpload则是实现异步文件上传的一种JavaScript库,它允许用户在不刷新整个页面的情况下进行文件上传,提高了用户体验。接下来,我们将详细讨论这两个知识点。 首先,**Spring** 是一个全面的后端应用框架,它...

    Ajax 文件上传组件

    在提供的`AsyncUploaderDemo.sln`和`AsyncUploaderDemo`文件中,很可能是包含了一个实际的示例项目,该项目可能展示了如何使用某种前端框架(如Angular、React或Vue)结合Ajax实现文件上传功能。通过打开和研究这个...

    ajax异步文件上传,servlet处理

    为了提供更好的用户体验,开发者通常会采用AJAX(Asynchronous JavaScript and XML)技术实现异步文件上传,避免传统方式下页面刷新带来的中断感。AJAX允许在后台与服务器进行通信,而无需刷新整个页面。本篇文章将...

Global site tag (gtag.js) - Google Analytics