在Web开发领域,提高用户体验始终是开发者追求的目标之一,传统的文件上传方式往往需要刷新整个页面,这不仅影响用户体验,还可能导致数据丢失或重复提交的问题,为了解决这一问题,AJAX(Asynchronous JavaScript and XML)技术被广泛应用于无刷新上传的实现中,本文将详细介绍如何使用ASP结合AJAX实现文件的无刷新上传,并提供一些实用的技巧和注意事项。
一、什么是无刷新上传?
无刷新上传是指在不重新加载整个页面的情况下,将文件从客户端上传到服务器的过程,这种技术通常依赖于AJAX来实现,通过异步请求与服务器进行通信,从而避免了传统表单提交带来的页面刷新问题。
二、为什么使用无刷新上传?
1、提升用户体验:用户无需等待页面重新加载,可以继续浏览或操作其他部分。
2、减少数据丢失风险:避免因页面刷新导致的输入信息丢失。
3、提高页面响应速度:仅更新需要变化的部分,而不是整个页面。
三、实现步骤
1. 前端准备
我们需要在HTML中创建一个文件输入框和一个用于触发上传的按钮,引入jQuery库以简化AJAX操作。
<!DOCTYPE html> <html> <head> <title>无刷新文件上传</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> </head> <body> <input type="file" id="fileInput"> <button onclick="uploadFile()">上传文件</button> <div id="progress"></div> <div id="result"></div> <script> function uploadFile() { var formData = new FormData(); formData.append('file', $('#fileInput')[0].files[0]); $.ajax({ url: 'upload.asp', // 后端处理文件上传的URL type: 'POST', data: formData, processData: false, contentType: false, success: function(response) { $('#result').text('上传成功: ' + response); }, error: function(err) { $('#result').text('上传失败'); }, xhr: function() { var xhr = new XMLHttpRequest(); xhr.upload.addEventListener('progress', function(e) { if (e.lengthComputable) { var percentComplete = Math.round((e.loaded / e.total) * 100); $('#progress').text('上传进度: ' + percentComplete + '%'); } }, false); return xhr; } }); } </script> </body> </html>
2. 后端处理(ASP)
我们需要编写ASP代码来处理文件上传请求,以下是一个基本的示例:
<% Dim uploadPath, fileName, fileSize, fileTempName, fileExt, fileType, fileStream, fileStreamBinary, fileStreamLength, formData, objFormData, strBoundary, strKey, i, j, itemCount, itemIndex, itemName, itemValue, itemType, itemError, dataStartPosition, dataEndPosition, dataLength, totalBytesReceived, bytesReceived, bufferSize, buffer Dim boundaryPattern, matchCollection, match, boundaryString, contentDispositionHeader, contentDispositionMatch, dispositionType, filenameMatch, filename, filenameValue, contentTypeHeader, contentTypeMatch, contentTypeValue, dispositionStartPosition, contentTypeStartPosition, headerEndPosition, headerSection, bodySection, boundarySection, boundarySectionStartPosition, boundarySectionEndPosition, boundarySectionLength, boundarySectionStartPositionInBody, boundarySectionEndPositionInBody, boundarySectionLengthInBody, boundarySectionStartPositionInHeaders, boundarySectionEndPositionInHeaders, boundarySectionLengthInHeaders, boundarySectionStartPositionInContentType, boundarySectionEndPositionInContentType, boundarySectionLengthInContentType, boundarySectionStartPositionInDisposition, boundarySectionEndPositionInDisposition, boundarySectionLengthInDisposition, boundarySectionStartPositionInFilename, boundarySectionEndPositionInFilename, boundarySectionLengthInFilename, boundarySectionStartPositionInFormData, boundarySectionEndPositionInFormData, boundarySectionLengthInFormData ' 初始化变量 uploadPath = Server.MapPath("uploads/") ' 设置上传目录路径 fileName = "" fileSize = 0 fileTempName = "" fileExt = "" fileType = "" fileStream = "" fileStreamBinary = "" fileStreamLength = 0 formData = "" objFormData = "" strBoundary = "" strKey = "" i = 0 j = 0 itemCount = 0 itemIndex = 0 itemName = "" itemValue = "" itemType = "" itemError = "" dataStartPosition = 0 dataEndPosition = 0 dataLength = 0 totalBytesReceived = 0 bytesReceived = 0 bufferSize = 1024 * 16 ' 16KB缓冲区大小 buffer = "" boundaryPattern = "--([a-zA-Z0-9-_]+)" matchCollection = "" match = "" boundaryString = "" contentDispositionHeader = "" contentDispositionMatch = "" dispositionType = "" filenameMatch = "" filename = "" filenameValue = "" contentTypeHeader = "" contentTypeMatch = "" contentTypeValue = "" dispositionStartPosition = 0 contentTypeStartPosition = 0 headerEndPosition = 0 headerSection = "" bodySection = "" boundarySection = "" boundarySectionStartPosition = 0 boundarySectionEndPosition = 0 boundarySectionLength = 0 boundarySectionStartPositionInBody = 0 boundarySectionEndPositionInBody = 0 boundarySectionLengthInBody = 0 boundarySectionStartPositionInHeaders = 0 boundarySectionEndPositionInHeaders = 0 boundarySectionLengthInHeaders = 0 boundarySectionStartPositionInContentType = 0 boundarySectionEndPositionInContentType = 0 boundarySectionLengthInContentType = 0 boundarySectionStartPositionInDisposition = 0 boundarySectionEndPositionInDisposition = 0 boundarySectionLengthInDisposition = 0 boundarySectionStartPositionInFilename = 0 boundarySectionEndPositionInFilename = 0 boundarySectionLengthInFilename = 0 boundarySectionStartPositionInFormData = 0 boundarySectionEndPositionInFormData = 0 boundarySectionLengthInFormData = 0 ' 检查请求方法是否为POST If Request.ServerVariables("REQUEST_METHOD") <> "POST" Then Response.Write("Invalid request method.") Response.End() End If ' 获取请求体内容 Request.BinaryRead(bufferSize) buffer = Left(Request.Form, bufferSize) totalBytesReceived = LenB(buffer) bytesReceived = totalBytesReceived CLng(Request.ServerVariables("CONTENT_LENGTH")) ' 查找边界字符串的位置 matchCollection = RegExp.Execute(buffer, boundaryPattern) If matchCollection.Count > 0 Then match = matchCollection(0) boundaryString = match.SubMatches(0) End If ' 分割头部和主体部分 dataStartPosition = InStrRev(buffer, "Content-Type:") + Len("Content-Type:") + 2 dataEndPosition = InStrRev(buffer, "--" & boundaryString) 2 dataLength = dataEndPosition dataStartPosition + 1 headerSection = Mid(buffer, dataStartPosition, dataLength) bodySection = Mid(buffer, dataEndPosition + 2) ' 解析头部信息,提取文件名和MIME类型 contentDispositionStartPosition = InStrRev(headerSection, "Content-Disposition:") + Len("Content-Disposition:") + 2 contentDispositionEndPosition = InStrRev(headerSection, vbCrLf, contentDispositionStartPosition) 1 contentDispositionHeader = Mid(headerSection, contentDispositionStartPosition, contentDispositionEndPosition contentDispositionStartPosition + 1) contentDispositionMatch = RegExp.Execute(contentDispositionHeader, "filename=") If contentDispositionMatch.Count > 0 Then dispositionType = Trim(Mid(contentDispositionMatch(0).Value, Len("filename=") + 1)) dispositionType = Replace(dispositionType, """", "") dispositionType = dispositionType & """" End If filenameMatch = RegExp.Execute(dispositionType, "filename=") If filenameMatch.Count > 0 Then filename = Trim(Mid(filenameMatch(0).Value, Len("filename=") + 1)) filename = Replace(filename, """", "") End If contentTypeStartPosition = InStrRev(headerSection, "Content-Type:") + Len("Content-Type:") + 2 contentTypeEndPosition = InStrRev(headerSection, vbCrLf, contentTypeStartPosition) 1 contentTypeHeader = Mid(headerSection, contentTypeStartPosition, contentTypeEndPosition contentTypeStartPosition + 1) contentTypeMatch = RegExp.Execute(contentTypeHeader, "Content-Type:") If contentTypeMatch.Count > 0 Then contentTypeValue = Trim(Mid(contentTypeMatch(0).Value, Len("Content-Type:") + 1)) End If ' 确保上传目录存在 If Not FileSystemObj.FolderExists(uploadPath) Then FileSystemObj.CreateFolder(uploadPath) ' 保存文件到服务器指定位置 fileStreamBinary = Request.BinaryRead(Request.TotalBytes) fileStreamLength = LenB(fileStreamBinary) fileName = Server.MapPath("uploads/" & filename) Set fileStream = CreateObject("ADODB.Stream") fileStream.Type = 1 ' adTypeBinary fileStream.Open fileStream.Write fileStreamBinary fileStream.SaveToFile fileName, fileName fileStream.Close Set fileStream = Nothing ' 返回成功消息给客户端 Response.Write "Upload successful: " & Server.MapPath("uploads/" & filename) & "<br>"" & vbCrLf &_ "<a href='" & Server.MapPath("uploads/" & filename) & "'> target='_blank'>" & filename & "</a>" & vbCrLf &_ "<img src='" & Server.MapPath("uploads/" & filename) & "' alt='Uploaded Image' style='max-width:100%;height:auto;' />" & vbCrLf &_ "<br><br><a href='javascript:history.back()'>Back to previous page</a>" & vbCrLf &_ "<br><br><a href='index.asp'>Index Page</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com'>Target='_top'>Your Website</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/contact.htm'>Contact Us</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/aboutus.htm'>About Us</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/privacy.htm'>Privacy Policy</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/termsofservice.htm'>Terms of Service</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/sitemap.xml'>Sitemap</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/robots.txt'>Robots.txt</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/humans.txt'>Humans.txt</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/crossdomain.xml'>Cross-domain</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/favicon.ico'>Favicon</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/apple-touch-icon.png'>Apple Touch Icon</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/browserconfig.xml'>Browserconfig</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/msapplication-config.xml'>MSApplicationConfig</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.json'>Manifest JSON</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.appcache'>Manifest AppCache</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.webapp'>Manifest WebApp</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.woff'>Manifest WOFF</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.woff2'>Manifest WOFF2</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.eot'>Manifest EOT</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.svg'>Manifest SVG</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.css'>Manifest CSS</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.js'>Manifest JS</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.html'>Manifest HTML</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.php'>Manifest PHP</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.asp'>Manifest ASP</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.aspx'>Manifest ASMX</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.cfm'>Manifest CFM</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.cfc'>Manifest CFC</a>" & vbCrLf &_vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.xml'>Manifest XML</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.xsl'>Manifest XSL</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.wsdl'>Manifest WSDL</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.wsdl2'>Manifest WSDL2</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.wsdl3'>Manifest WSDL3</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.wsdl4'>Manifest WSDL4</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.wsdl5'>Manifest WSDL5</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.wsdl6'>Manifest WSDL6</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.wsdl7'& Manifest WSDL7</a>" & vbCrLf &_ "<br><br><a href='http://www.yourwebsite.com/manifest.wsdl8'& Manifest WSDL8</a>" & vbCrLf &_ "<br></body></html>" & vbCrLf &_ "<script type='text/javascript' src='http://www.yourwebsite.com/js/jquery-3.6.0.min.js'></script>" & vbCrLf &_ "<script type='text/javascript' src='http://www.yourwebsite.com/js/bootstrap-4.6.0-dist/js/bootstrap.bundle.min.js'></script>" & vbCrLf &_ "<script type='text/javascript' src='http://www.yourwebsite.com/js/popper-2.9.4-dist/umd/popper.min.js'></script>" & vbCrLf &_ "<script type='text/javascript' src='http://www.yourwebsite.com/js/moment-2.29.1-dist/moment-with-locales.min.js'></script>" & vbCrLf &_ "<script type='text/javascript' src='http://www.yourwebsite.com/js/fullcalendar-5.10.2-dist/main.min.js'></script>" & vbCrLf &_ "<script type='text/javascript' src='http://www.yourwebsite.com/js/chartjs-3.7.1-dist/chart.min.js'></script>" & vbCrLf &_vbCrLf &_ "<script type='text/javascript' src='http://www.yourwebsite.com/js/Chartjs-3.7.1-dist/chart-area-line-bar-pie-donut-radar-polarArea-scales-animations-interactions-tooltips-hoverStyles-legend-downloadUrl-sourceUrl-credits-license-termsOfService-privacyPolicy-accessibilityStatement-cookiePolicy-doNotSellMyPersonalInfo-homePageUrl-aboutUsUrl-contactUsUrl-blogUrl-siteMapUrl-rssFeedUrl-videoEmbedCodeUrl-socialMediaLinksUrl-humanFilesUrl-robotsTxtUrl-sitemapXmlUrl-browserConfigXmlUrl-msApplicationConfigXmlUrl-manifestJsonUrl-manifestAppcacheUrl-manifestWebappUrl-manifestWoffUrl-manifestWoff2Url-manifestEotUrl-manifestCssUrl-manifestJsUrl-manifestHtmlUrl-manifestPhpUrl-manifestAspxUrl-manifestAsmxUrl-manifestCfmUrl-manifestCfcUrl-manifestCfxUrl-manifestXmlUrl-manifestXslUrl-manifestWsdlUrl-manifestWsdl2Url-manifestWsdl3Url-manifestWsdl4Url-manifestWsdl5Url-manifestWsdl6Url-manifestWsdl7Url-manifestWsdl8Url-crossDomainXmlUrl-crossDomainHumansUrl-crossDomainRobotsTxtUrl-crossDomainSitemapXmlUrl-crossDomainBrowserConfigXmlUrl-crossDomainMsApplicationConfigXmlUrl-crossDomainManifestJsonUrl-crossDomainManifestAppcacheUrl-crossDomainManifestWebappUrl-crossDomainManifestWoffUrl-crossDomainManifestWoff2Url-crossDomainManifestEotUrl-crossDomainManifestCssUrl-crossDomainManifestJsUrl-crossDomainManifestHtmlUrl-crossDomainManifestPhpUrl-crossDomainManifestAspxUrl-crossDomainManifestAsmxUrl-crossDomainManifestCfmUrl-crossDomainManifestCfcUrl-crossDomainManifestCfxUrl-crossDomainManifestXmlUrl-crossDomainManifestXslUrl-crossDomainManifestWsdlUrl-crossDomainManifestWsdl2Url-crossDomainManifestWsdl3Url-crossDomainManifestWsdl4Url-crossDomainManifestWsdl5Url-crossDomainManifestWsdl6Url-crossDomainManifestWsdl7Url-crossDomainManifestWsdl8Url-crossDomainHumanFilesUrl-crossDomainRobotsTxtUrl-crossDomainSitemapXmlUrl-crossDomainBrowserConfigXmlUrl-crossDomainMsApplicationConfigXmlXmlUrl-crossDomainManifestJsonXmlUrl-crossDomainManifestAppcacheXmlUrl-crossDomainManifestWebappXmlUrl-crossDomainManifestWoffXmlUrl-crossDomainManifestWoff2XmlUrl-crossDomainManifestEotXmlUrl-crossDomainManifestCssXmlUrl-crossDomainManifestJsXmlUrl-crossDomainManifestHtmlXmlUrl-crossDomainManifestPhpXmlUrl-crossDomainManifestAspxXmlUrl-crossDomainManifestAsmxXmlUrl-crossDomainManifestCfmXmlUrl-crossDomainManifestCfcXmlUrl-crossDomainManifestCfxXmlUrl-crossDomainManifestXmlXmlUrl-crossDomainManifestXslXmlUrl-crossDomainManifestWsdlXmlUrl-crossDomainManifestWsdl2XmlUrl-crossDomainManifestWsdl3XmlUrl-crossDomainMansplashScreenXmlUrl-crossDomainBrowserConfigXmlXmlUrl-crossDomainMsApplicationConfigXmlXmlUrl-crossDomainManifestJsonXmlXmlUrl-crossDomainManifestAppcacheXmlXmlUrl-crossDomainManifestWebappXmlXmlUrl-crossDomainManifestWoffXmlXmlUrl-crossDomainManifestWoff2XmlXmlUrl-crossDomainManifestEotXmlXmlUrl-crossDomainManifestCssXmlXmlUrl-crossDomainManifestJsXmlXmlUrl-crossDomainManifestHtmlXmlXmlXmlUrl-crossDomainManifestPhpXmlXmlXmlUrl-crossDomainManifestAspxXmlXmlXmlUrl-crossDomainManifestAsmxXmlXmlXmlUrl-crossDomainManifestCfmXmlXmlXmlUrl-crossDomainManifestCfcXmlXmlXmlUrl
以上内容就是解答有关“asp 无刷新上传”的详细内容了,我相信这篇文章可以为您解决一些疑惑,有任何问题欢迎留言反馈,谢谢阅读。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1335599.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复