如何使用 jQuery 异步上传文件?
- 2024-11-02 21:00:00
- admin 原创
- 31
问题描述:
我想使用 jQuery 异步上传文件。
$(document).ready(function () {
$("#uploadbutton").click(function () {
var filename = $("#file").val();
$.ajax({
type: "POST",
url: "addFile.do",
enctype: 'multipart/form-data',
data: {
file: filename
},
success: function () {
alert("Data Uploaded: ");
}
});
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<span>File</span>
<input type="file" id="file" name="file" size="10"/>
<input id="uploadbutton" type="button" value="Upload"/>
运行代码片段Hide results展开片段
我没有上传文件,只获取了文件名。我该如何修复此问题?
解决方案 1:
使用HTML5,您可以使用 Ajax 和 jQuery 进行文件上传。不仅如此,您还可以进行文件验证(名称、大小和 MIME 类型)或使用 HTML5 进度标签(或 div)处理进度事件。最近我不得不制作一个文件上传器,但我不想使用Flash、iframe 或插件,经过一番研究,我找到了解决方案。
HTML:
<form enctype="multipart/form-data">
<input name="file" type="file" />
<input type="button" value="Upload" />
</form>
<progress></progress>
首先,您可以根据需要进行一些验证。例如,在.on('change')
文件事件中:
$(':file').on('change', function () {
var file = this.files[0];
if (file.size > 1024) {
alert('max upload size is 1k');
}
// Also see .name, .type
});
现在$.ajax()
点击按钮即可提交:
$(':button').on('click', function () {
$.ajax({
// Your server script to process the upload
url: 'upload.php',
type: 'POST',
// Form data
data: new FormData($('form')[0]),
// Tell jQuery not to process data or worry about content-type
// You *must* include these options!
cache: false,
contentType: false,
processData: false,
// Custom XMLHttpRequest
xhr: function () {
var myXhr = $.ajaxSettings.xhr();
if (myXhr.upload) {
// For handling the progress of the upload
myXhr.upload.addEventListener('progress', function (e) {
if (e.lengthComputable) {
$('progress').attr({
value: e.loaded,
max: e.total,
});
}
}, false);
}
return myXhr;
}
});
});
如您所见,使用 HTML5(以及一些研究)文件上传不仅成为可能,而且非常容易。尝试使用Google Chrome,因为示例中的一些 HTML5 组件并非在每个浏览器中都可用。
解决方案 2:
2019 年更新:这仍然取决于您的人口统计数据所使用的浏览器。
对于“新” HTML5 file
API,需要了解的一件重要事情是,它直到 IE 10 才得到支持。如果您所针对的特定市场对旧版 Windows 的倾向高于平均水平,则您可能无法访问它。
截至 2017 年,大约 5% 的浏览器是 IE 6、7、8 或 9。如果你进入一家大公司(例如,这是 B2B 工具或你用于培训的东西),这个数字可能会飙升。2016 年,我与一家在 60% 以上的机器上使用 IE8 的公司打过交道。
截至本文编辑时已是 2019 年,距离我最初的回答已过去近 11 年。IE9 及更低版本在全球范围内的使用率约为 1%,但仍有使用率较高的群体。
不管是什么功能,从中得到的重要启示是,检查用户使用的浏览器。如果不这样做,你就会很快学到一个痛苦的教训,那就是为什么“对我有用”在交付给客户的产品中还不够好。caniuse是一个有用的工具,但请注意他们的人口统计数据来自哪里。他们可能与你的不一致。企业环境尤其如此。
以下是我在 2008 年给出的答案。
但是,有一些可行的非 JS 文件上传方法。您可以在页面上创建一个 iframe(使用 CSS 隐藏),然后将表单定位到该 iframe。主页无需移动。
这是一篇“真实”的帖子,因此并非完全具有交互性。如果您需要状态,则需要服务器端来处理它。这在很大程度上取决于您的服务器。ASP.NET具有更好的机制。PHP 显然会失败,但您可以使用Perl或Apache 修改来解决这个问题。
如果需要上传多个文件,最好一次上传一个文件(以克服最大文件上传限制)。将第一个表单发布到 iframe,使用上面的方法监控其进度,完成后,将第二个表单发布到 iframe,依此类推。
或者使用 Java/Flash 解决方案。他们可以更加灵活地处理帖子...
解决方案 3:
我建议使用Fine Uploader插件来实现此目的。您的JavaScript
代码如下:
$(document).ready(function() {
$("#uploadbutton").jsupload({
action: "addFile.do",
onComplete: function(response){
alert( "server response: " + response);
}
});
});
解决方案 4:
注意:这个答案已经过时了,现在可以使用 XHR 上传文件。
您无法使用XMLHttpRequest (Ajax) 上传文件。您可以使用 iframe 或 Flash 模拟效果。出色的jQuery Form Plugin通过 iframe 发布文件以获得效果。
解决方案 5:
为未来的读者做总结。
异步文件上传
使用 HTML5
如果支持FormData和File API(均为 HTML5 功能),您可以使用该方法通过 jQuery上传文件。$.ajax()
您也可以在没有 FormData 的情况下发送文件,但无论哪种方式,都必须存在文件 API 才能处理文件,以便可以使用XMLHttpRequest(Ajax)发送文件。
$.ajax({
url: 'file/destination.html',
type: 'POST',
data: new FormData($('#formWithFiles')[0]), // The form with the file inputs.
processData: false,
contentType: false // Using FormData, no need to process data.
}).done(function(){
console.log("Success: Files sent!");
}).fail(function(){
console.log("An error occurred, the files couldn't be sent!");
});
有关快速、纯 JavaScript(无 jQuery)示例,请参阅“使用 FormData 对象发送文件”。
倒退
当不支持 HTML5(没有文件 API)时,唯一的其他纯 JavaScript 解决方案(没有Flash或任何其他浏览器插件)是隐藏的 iframe技术,它允许在不使用XMLHttpRequest对象的情况下模拟异步请求。
它包括将 iframe 设置为包含文件输入的表单目标。当用户提交请求时,会上传文件,但响应会显示在 iframe 内,而不是重新呈现主页。隐藏 iframe 使整个过程对用户透明,并模拟异步请求。
如果操作正确,它几乎可以在任何浏览器上运行,但是对于如何从 iframe 获取响应有一些注意事项。
在这种情况下,您可能更喜欢使用像Bifröst这样的包装器插件,它使用iframe 技术,但也提供jQuery Ajax 传输,允许仅使用如下方法发送文件:$.ajax()
$.ajax({
url: 'file/destination.html',
type: 'POST',
// Set the transport to use (iframe means to use Bifröst)
// and the expected data type (json in this case).
dataType: 'iframe json',
fileInputs: $('input[type="file"]'), // The file inputs containing the files to send.
data: { msg: 'Some extra data you might need.'}
}).done(function(){
console.log("Success: Files sent!");
}).fail(function(){
console.log("An error occurred, the files couldn't be sent!");
});
插件
Bifröst只是一个小型包装器,它为 jQuery 的 ajax 方法添加了后备支持,但许多上述插件(如jQuery Form Plugin或jQuery File Upload)都包含从 HTML5 到不同后备的整个堆栈以及一些有用的功能,以简化流程。根据您的需求和要求,您可能需要考虑裸实现或其中任何一个插件。
解决方案 6:
这个AJAX 文件上传 jQuery 插件将文件上传到某个地方,并将响应传递给回调,仅此而已。
它不依赖于特定的 HTML,只需给它一个
<input type="file">
它不需要您的服务器以任何特定方式响应
无论你使用多少个文件,或者它们在页面上的位置
-- 尽量少用 --
$('#one-specific-file').ajaxfileupload({
'action': '/upload.php'
});
— 或者多达 —
$('input[type="file"]').ajaxfileupload({
'action': '/upload.php',
'params': {
'extra': 'info'
},
'onComplete': function(response) {
console.log('custom handler for file:');
alert(JSON.stringify(response));
},
'onStart': function() {
if(weWantedTo) return false; // cancels upload
},
'onCancel': function() {
console.log('no file selected');
}
});
解决方案 7:
我一直在使用下面的脚本上传图像,效果很好。
HTML
<input id="file" type="file" name="file"/>
<div id="response"></div>
JavaScript
jQuery('document').ready(function(){
var input = document.getElementById("file");
var formdata = false;
if (window.FormData) {
formdata = new FormData();
}
input.addEventListener("change", function (evt) {
var i = 0, len = this.files.length, img, reader, file;
for ( ; i < len; i++ ) {
file = this.files[i];
if (!!file.type.match(/image.*/)) {
if ( window.FileReader ) {
reader = new FileReader();
reader.onloadend = function (e) {
//showUploadedItem(e.target.result, file.fileName);
};
reader.readAsDataURL(file);
}
if (formdata) {
formdata.append("image", file);
formdata.append("extra",'extra-data');
}
if (formdata) {
jQuery('div#response').html('<br /><img src="ajax-loader.gif"/>');
jQuery.ajax({
url: "upload.php",
type: "POST",
data: formdata,
processData: false,
contentType: false,
success: function (res) {
jQuery('div#response').html("Successfully uploaded");
}
});
}
}
else
{
alert('Not a vaild image!');
}
}
}, false);
});
解释
我使用响应div
来显示上传动画和上传完成后的响应。
最好的部分是,当您使用此脚本时,您可以随文件发送额外的数据,例如 ID 等。我extra-data
在脚本中提到过它。
在 PHP 级别,这将作为正常文件上传工作。额外数据可以作为数据检索$_POST
。
在这里你不用使用插件之类的东西。你可以随意更改代码。你在这里不是盲目地编码。这是任何 jQuery 文件上传的核心功能。实际上是 Javascript。
解决方案 8:
你可以用原生 JavaScript 轻松实现这一点。以下是我当前项目中的片段:
var xhr = new XMLHttpRequest();
xhr.upload.onprogress = function(e) {
var percent = (e.position/ e.totalSize);
// Render a pretty progress bar
};
xhr.onreadystatechange = function(e) {
if(this.readyState === 4) {
// Handle file upload complete
}
};
xhr.open('POST', '/upload', true);
xhr.setRequestHeader('X-FileName',file.name); // Pass the filename along
xhr.send(file);
解决方案 9:
您可以使用 jQuery 简单上传.ajax()
。
HTML:
<form id="upload-form">
<div>
<label for="file">File:</label>
<input type="file" id="file" name="file" />
<progress class="progress" value="0" max="100"></progress>
</div>
<hr />
<input type="submit" value="Submit" />
</form>
CSS
.progress { display: none; }
JavaScript的:
$(document).ready(function(ev) {
$("#upload-form").on('submit', (function(ev) {
ev.preventDefault();
$.ajax({
xhr: function() {
var progress = $('.progress'),
xhr = $.ajaxSettings.xhr();
progress.show();
xhr.upload.onprogress = function(ev) {
if (ev.lengthComputable) {
var percentComplete = parseInt((ev.loaded / ev.total) * 100);
progress.val(percentComplete);
if (percentComplete === 100) {
progress.hide().val(0);
}
}
};
return xhr;
},
url: 'upload.php',
type: 'POST',
data: new FormData(this),
contentType: false,
cache: false,
processData: false,
success: function(data, status, xhr) {
// ...
},
error: function(xhr, status, error) {
// ...
}
});
}));
});
解决方案 10:
我过去所做过的最简单、最强大的方法是简单地用表单定位一个隐藏的 iFrame 标签 - 然后它将在 iframe 内提交而无需重新加载页面。
如果您不想使用插件、JavaScript 或 HTML 以外的任何其他形式的“魔法”,那就这样吧。当然,您可以将其与 JavaScript 或其他任何已有的东西结合起来……
<form target="iframe" action="" method="post" enctype="multipart/form-data">
<input name="file" type="file" />
<input type="button" value="Upload" />
</form>
<iframe name="iframe" id="iframe" style="display:none" ></iframe>
您还可以读取 iframe 的内容onLoad
以了解服务器错误或成功响应,然后将其输出给用户。
Chrome、iFrames 和 onLoad
-注意- 如果你对如何在上传/下载时设置 UI 拦截器感兴趣,那么你只需要继续阅读
目前,Chrome 在使用 iframe 传输文件时不会触发其 onLoad 事件。Firefox、IE 和 Edge 均会在文件传输时触发 onload 事件。
我发现适用于 Chrome 的唯一解决方案是使用 cookie。
在开始上传/下载时基本上要这样做:
[客户端] 启动一个间隔来查找 cookie 的存在
[服务器端] 对文件数据进行任何你需要的操作
[服务器端] 设置客户端间隔的 cookie
[客户端] Interval 看到 cookie 并像 onLoad 事件一样使用它。例如,您可以启动 UI 拦截器,然后在 onLoad(或生成 cookie 时)删除 UI 拦截器。
虽然使用 cookie 来实现这一点不太好,但是它确实有效。
我制作了一个 jQuery 插件来处理 Chrome 下载时的这个问题,你可以在这里找到
https://github.com/ArtisticPhoenix/jQuery-Plugins/blob/master/iDownloader.js
相同的基本原理也适用于上传。
使用下载器(显然包括 JS)
$('body').iDownloader({
"onComplete" : function(){
$('#uiBlocker').css('display', 'none'); //hide ui blocker on complete
}
});
$('somebuttion').click( function(){
$('#uiBlocker').css('display', 'block'); //block the UI
$('body').iDownloader('download', 'htttp://example.com/location/of/download');
});
在服务器端,在传输文件数据之前,创建 cookie
setcookie('iDownloader', true, time() + 30, "/");
插件将看到该 cookie,然后触发onComplete
回调。
解决方案 11:
我在 Rails 环境中编写了此代码。如果使用轻量级 jQuery-form 插件,则只需大约五行 JavaScript。
挑战在于如何让 AJAX 上传正常工作,因为标准remote_form_for
不理解多部分表单提交。它不会发送 Rails 通过 AJAX 请求寻找的文件数据。
这就是 jQuery-form 插件发挥作用的地方。
以下是其 Rails 代码:
<% remote_form_for(:image_form,
:url => { :controller => "blogs", :action => :create_asset },
:html => { :method => :post,
:id => 'uploadForm', :multipart => true })
do |f| %>
Upload a file: <%= f.file_field :uploaded_data %>
<% end %>
以下是相关的 JavaScript:
$('#uploadForm input').change(function(){
$(this).parent().ajaxSubmit({
beforeSubmit: function(a,f,o) {
o.dataType = 'json';
},
complete: function(XMLHttpRequest, textStatus) {
// XMLHttpRequest.responseText will contain the URL of the uploaded image.
// Put it in an image element you create, or do with it what you will.
// For example, if you have an image elemtn with id "my_image", then
// $('#my_image').attr('src', XMLHttpRequest.responseText);
// Will set that image tag to display the uploaded image.
},
});
});
下面是 Rails 控制器操作,非常原始:
@image = Image.new(params[:image_form])
@image.save
render :text => @image.public_filename
过去几周我一直在 Bloggity 上使用它,它的效果非常好。
解决方案 12:
简单的 Ajax 上传器是另一种选择:
https://github.com/LPology/Simple-Ajax-Uploader
跨浏览器 - 适用于 IE7+、Firefox、Chrome、Safari、Opera
支持多个并发上传 - 即使在非 HTML5 浏览器中
无需 Flash 或外部 CSS - 只需一个 5Kb 的 Javascript 文件
可选,内置支持完全跨浏览器的进度条(使用 PHP 的 APC 扩展)
灵活且高度可定制 - 使用任何元素作为上传按钮,设计您自己的进度指示器
无需表格,只需提供一个作为上传按钮的元素
MIT 许可证——可在商业项目中免费使用
使用示例:
var uploader = new ss.SimpleUpload({
button: $('#uploadBtn'), // upload button
url: '/uploadhandler', // URL of server-side upload handler
name: 'userfile', // parameter name of the uploaded file
onSubmit: function() {
this.setProgressBar( $('#progressBar') ); // designate elem as our progress bar
},
onComplete: function(file, response) {
// do whatever after upload is finished
}
});
解决方案 13:
我发现的一个解决方案是将<form>
目标设为隐藏的 iFrame。然后 iFrame 可以运行 JS 来向用户显示它已完成(在页面加载时)。
解决方案 14:
这只是如何上传文件的另一种解决方案(无需任何插件)
使用简单的Javascript和AJAX(带进度条)
HTML 部分
<form id="upload_form" enctype="multipart/form-data" method="post">
<input type="file" name="file1" id="file1"><br>
<input type="button" value="Upload File" onclick="uploadFile()">
<progress id="progressBar" value="0" max="100" style="width:300px;"></progress>
<h3 id="status"></h3>
<p id="loaded_n_total"></p>
</form>
JS 部分
function _(el){
return document.getElementById(el);
}
function uploadFile(){
var file = _("file1").files[0];
// alert(file.name+" | "+file.size+" | "+file.type);
var formdata = new FormData();
formdata.append("file1", file);
var ajax = new XMLHttpRequest();
ajax.upload.addEventListener("progress", progressHandler, false);
ajax.addEventListener("load", completeHandler, false);
ajax.addEventListener("error", errorHandler, false);
ajax.addEventListener("abort", abortHandler, false);
ajax.open("POST", "file_upload_parser.php");
ajax.send(formdata);
}
function progressHandler(event){
_("loaded_n_total").innerHTML = "Uploaded "+event.loaded+" bytes of "+event.total;
var percent = (event.loaded / event.total) * 100;
_("progressBar").value = Math.round(percent);
_("status").innerHTML = Math.round(percent)+"% uploaded... please wait";
}
function completeHandler(event){
_("status").innerHTML = event.target.responseText;
_("progressBar").value = 0;
}
function errorHandler(event){
_("status").innerHTML = "Upload Failed";
}
function abortHandler(event){
_("status").innerHTML = "Upload Aborted";
}
PHP 部分
<?php
$fileName = $_FILES["file1"]["name"]; // The file name
$fileTmpLoc = $_FILES["file1"]["tmp_name"]; // File in the PHP tmp folder
$fileType = $_FILES["file1"]["type"]; // The type of file it is
$fileSize = $_FILES["file1"]["size"]; // File size in bytes
$fileErrorMsg = $_FILES["file1"]["error"]; // 0 for false... and 1 for true
if (!$fileTmpLoc) { // if file not chosen
echo "ERROR: Please browse for a file before clicking the upload button.";
exit();
}
if(move_uploaded_file($fileTmpLoc, "test_uploads/$fileName")){ // assuming the directory name 'test_uploads'
echo "$fileName upload is complete";
} else {
echo "move_uploaded_file function failed";
}
?>
这是示例应用程序
解决方案 15:
jQuery Uploadify是另一个我以前用过上传文件的插件。JavaScript 代码非常简单,如下所示: code。但是,新版本在 Internet Explorer 中无法使用。
$('#file_upload').uploadify({
'swf': '/public/js/uploadify.swf',
'uploader': '/Upload.ashx?formGuid=' + $('#formGuid').val(),
'cancelImg': '/public/images/uploadify-cancel.png',
'multi': true,
'onQueueComplete': function (queueData) {
// ...
},
'onUploadStart': function (file) {
// ...
}
});
我搜索了很多次,终于找到了另一种解决方案,无需任何插件,只需使用 ajax 即可上传文件。解决方案如下:
$(document).ready(function () {
$('#btn_Upload').live('click', AjaxFileUpload);
});
function AjaxFileUpload() {
var fileInput = document.getElementById("#Uploader");
var file = fileInput.files[0];
var fd = new FormData();
fd.append("files", file);
var xhr = new XMLHttpRequest();
xhr.open("POST", 'Uploader.ashx');
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
alert('success');
}
else if (uploadResult == 'success')
alert('error');
};
xhr.send(fd);
}
解决方案 16:
var formData=new FormData();
formData.append("fieldname","value");
formData.append("image",$('[name="filename"]')[0].files[0]);
$.ajax({
url:"page.php",
data:formData,
type: 'POST',
dataType:"JSON",
cache: false,
contentType: false,
processData: false,
success:function(data){ }
});
您可以使用表单数据来发布所有值,包括图像。
解决方案 17:
一种不使用 Jquery 的现代方法是使用用户选择文件时返回的FileList对象,然后使用Fetch发布包裹在FormData对象中的 FileList 。<input type="file">
// The input DOM element // <input type="file">
const inputElement = document.querySelector('input[type=file]');
// Listen for a file submit from user
inputElement.addEventListener('change', () => {
const data = new FormData();
data.append('file', inputElement.files[0]);
data.append('imageName', 'flower');
// You can then post it to your server.
// Fetch can accept an object of type FormData on its body
fetch('/uploadImage', {
method: 'POST',
body: data
});
});
解决方案 18:
要使用 Jquery 异步上传文件,请执行以下步骤:
步骤 1在您的项目中打开 Nuget 管理器并添加包(jquery fileupload(只需在搜索框中输入它,它就会出现并安装它。))URL:https ://github.com/blueimp/jQuery-File-Upload
步骤 2通过运行上述包,在已添加到项目的 HTML 文件中添加以下脚本:
jquery.ui.小部件.js
jquery.iframe-传输.js
jquery.文件上传.js
步骤3 按照以下代码编写文件上传控件:
<input id="upload" name="upload" type="file" />
步骤4 编写一个js方法作为uploadFile,如下所示:
function uploadFile(element) {
$(element).fileupload({
dataType: 'json',
url: '../DocumentUpload/upload',
autoUpload: true,
add: function (e, data) {
// write code for implementing, while selecting a file.
// data represents the file data.
//below code triggers the action in mvc controller
data.formData =
{
files: data.files[0]
};
data.submit();
},
done: function (e, data) {
// after file uploaded
},
progress: function (e, data) {
// progress
},
fail: function (e, data) {
//fail operation
},
stop: function () {
code for cancel operation
}
});
};
步骤 5在 ready 函数中调用元素文件上传来启动如下过程:
$(document).ready(function()
{
uploadFile($('#upload'));
});
步骤6按照如下步骤编写MVC控制器和Action:
public class DocumentUploadController : Controller
{
[System.Web.Mvc.HttpPost]
public JsonResult upload(ICollection<HttpPostedFileBase> files)
{
bool result = false;
if (files != null || files.Count > 0)
{
try
{
foreach (HttpPostedFileBase file in files)
{
if (file.ContentLength == 0)
throw new Exception("Zero length file!");
else
//code for saving a file
}
}
catch (Exception)
{
result = false;
}
}
return new JsonResult()
{
Data=result
};
}
}
解决方案 19:
这是我的解决方案。
<form enctype="multipart/form-data">
<div class="form-group">
<label class="control-label col-md-2" for="apta_Description">Description</label>
<div class="col-md-10">
<input class="form-control text-box single-line" id="apta_Description" name="apta_Description" type="text" value="">
</div>
</div>
<input name="file" type="file" />
<input type="button" value="Upload" />
</form>
和 js
<script>
$(':button').click(function () {
var formData = new FormData($('form')[0]);
$.ajax({
url: '@Url.Action("Save", "Home")',
type: 'POST',
success: completeHandler,
data: formData,
cache: false,
contentType: false,
processData: false
});
});
function completeHandler() {
alert(":)");
}
</script>
控制器
[HttpPost]
public ActionResult Save(string apta_Description, HttpPostedFileBase file)
{
[...]
}
解决方案 20:
对于您的情况,您需要使用Ajax来促进文件上传到服务器:
<from action="" id="formContent" method="post" enctype="multipart/form-data">
<span>File</span>
<input type="file" id="file" name="file" size="10"/>
<input id="uploadbutton" type="button" value="Upload"/>
</form>
提交的数据是表单数据。在 jQuery 上,使用表单提交功能(而不是单击按钮)来提交表单文件,如下所示。
$(document).ready(function () {
$("#formContent").submit(function(e){
e.preventDefault();
var formdata = new FormData(this);
$.ajax({
url: "ajax_upload_image.php",
type: "POST",
data: formdata,
mimeTypes:"multipart/form-data",
contentType: false,
cache: false,
processData: false,
success: function(){
alert("successfully submitted");
});
});
});
解决方案 21:
您可以使用
$(function() {
$("#file_upload_1").uploadify({
height : 30,
swf : '/uploadify/uploadify.swf',
uploader : '/uploadify/uploadify.php',
width : 120
});
});
演示
解决方案 22:
示例:如果您使用 jQuery,您可以轻松上传文件。这是一个小而强大的 jQuery 插件,http://jquery.malsup.com/form/。
例子
var $bar = $('.ProgressBar');
$('.Form').ajaxForm({
dataType: 'json',
beforeSend: function(xhr) {
var percentVal = '0%';
$bar.width(percentVal);
},
uploadProgress: function(event, position, total, percentComplete) {
var percentVal = percentComplete + '%';
$bar.width(percentVal)
},
success: function(response) {
// Response
}
});
我希望这会有所帮助
解决方案 23:
使用 HTML5 的readAsDataURL()或某些 base64 编码器将文件转换为 base64 。
在此处查看
var reader = new FileReader();
reader.onload = function(readerEvt) {
var binaryString = readerEvt.target.result;
document.getElementById("base64textarea").value = btoa(binaryString);
};
reader.readAsBinaryString(file);
然后检索:
window.open("data:application/octet-stream;base64," + base64);
解决方案 24:
您可以在使用 XMLHttpRequest(不依赖 flash 和 iframe)进行异步上传时将附加参数与文件名一起传递。将附加参数值附加到 FormData 中并发送上传请求。
var formData = new FormData();
formData.append('parameter1', 'value1');
formData.append('parameter2', 'value2');
formData.append('file', $('input[type=file]')[0].files[0]);
$.ajax({
url: 'post back url',
data: formData,
// other attributes of AJAX
});
此外,Syncfusion JavaScript UI 文件上传仅使用事件参数即可为这种情况提供解决方案。您可以在此处找到文档,并在此处找到有关此控件的更多详细信息,请在此处输入链接描述
解决方案 25:
在这里
查找异步处理文件上传过程: https://developer.mozilla.org/en-US/docs/Using_files_from_web_applications
链接中的样本
<?php
if (isset($_FILES['myFile'])) {
// Example:
move_uploaded_file($_FILES['myFile']['tmp_name'], "uploads/" . $_FILES['myFile']['name']);
exit;
}
?><!DOCTYPE html>
<html>
<head>
<title>dnd binary upload</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript">
function sendFile(file) {
var uri = "/index.php";
var xhr = new XMLHttpRequest();
var fd = new FormData();
xhr.open("POST", uri, true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
// Handle response.
alert(xhr.responseText); // handle response.
}
};
fd.append('myFile', file);
// Initiate a multipart/form-data upload
xhr.send(fd);
}
window.onload = function() {
var dropzone = document.getElementById("dropzone");
dropzone.ondragover = dropzone.ondragenter = function(event) {
event.stopPropagation();
event.preventDefault();
}
dropzone.ondrop = function(event) {
event.stopPropagation();
event.preventDefault();
var filesArray = event.dataTransfer.files;
for (var i=0; i<filesArray.length; i++) {
sendFile(filesArray[i]);
}
}
}
</script>
</head>
<body>
<div>
<div id="dropzone" style="margin:30px; width:500px; height:300px; border:1px dotted grey;">Drag & drop your file here...</div>
</div>
</body>
</html>
解决方案 26:
您可以通过 JavaScript 使用较新的 Fetch API。如下所示:
function uploadButtonCLicked(){
var input = document.querySelector('input[type="file"]')
fetch('/url', {
method: 'POST',
body: input.files[0]
}).then(res => res.json()) // you can do something with response
.catch(error => console.error('Error:', error))
.then(response => console.log('Success:', response));
}
优点:所有现代浏览器都原生支持Fetch API ,因此您无需导入任何内容。另请注意,fetch() 返回一个Promise,然后使用.then(..code to handle response..)
异步方式处理。
解决方案 27:
使用HTML5和JavaScript,异步上传非常容易,我与您的 html 一起创建上传逻辑,这并不能完全工作,因为它需要 api,但演示了它是如何工作的,如果您的网站根目录调用了端点/upload
,则此代码应该适合您:
const asyncFileUpload = () => {
const fileInput = document.getElementById("file");
const file = fileInput.files[0];
const uri = "/upload";
const xhr = new XMLHttpRequest();
xhr.upload.onprogress = e => {
const percentage = e.loaded / e.total;
console.log(percentage);
};
xhr.onreadystatechange = e => {
if (xhr.readyState === 4 && xhr.status === 200) {
console.log("file uploaded");
}
};
xhr.open("POST", uri, true);
xhr.setRequestHeader("X-FileName", file.name);
xhr.send(file);
}
<form>
<span>File</span>
<input type="file" id="file" name="file" size="10" />
<input onclick="asyncFileUpload()" id="upload" type="button" value="Upload" />
</form>
运行代码片段Hide results展开片段
还有一些有关 XMLHttpReques 的更多信息:
XMLHttpRequest对象
所有现代浏览器都支持 XMLHttpRequest 对象。XMLHttpRequest 对象可用于在后台与 Web 服务器交换数据。这意味着可以更新网页的某些部分,而无需重新加载整个页面。
创建 XMLHttpRequest 对象
所有现代浏览器(Chrome、Firefox、IE7+、Edge、Safari、Opera)都有内置的 XMLHttpRequest 对象。
创建 XMLHttpRequest 对象的语法:
变量=新的XMLHttpRequest();
跨域访问
出于安全原因,现代浏览器不允许跨域访问。
这意味着网页和它尝试加载的 XML 文件必须位于同一台服务器上。
W3Schools 上的示例全部打开位于 W3Schools 域上的 XML 文件。
如果您想在自己的网页上使用上述示例,则您加载的 XML 文件必须位于您自己的服务器上。
欲了解更多详情,您可以继续阅读...
解决方案 28:
对于 PHP,请查找https://developer.hyvor.com/php/image-upload-ajax-php-mysql
HTML
<html>
<head>
<title>Image Upload with AJAX, PHP and MYSQL</title>
</head>
<body>
<form onsubmit="submitForm(event);">
<input type="file" name="image" id="image-selecter" accept="image/*">
<input type="submit" name="submit" value="Upload Image">
</form>
<div id="uploading-text" style="display:none;">Uploading...</div>
<img id="preview">
</body>
</html>
JavaScript
var previewImage = document.getElementById("preview"),
uploadingText = document.getElementById("uploading-text");
function submitForm(event) {
// prevent default form submission
event.preventDefault();
uploadImage();
}
function uploadImage() {
var imageSelecter = document.getElementById("image-selecter"),
file = imageSelecter.files[0];
if (!file)
return alert("Please select a file");
// clear the previous image
previewImage.removeAttribute("src");
// show uploading text
uploadingText.style.display = "block";
// create form data and append the file
var formData = new FormData();
formData.append("image", file);
// do the ajax part
var ajax = new XMLHttpRequest();
ajax.onreadystatechange = function() {
if (this.readyState === 4 && this.status === 200) {
var json = JSON.parse(this.responseText);
if (!json || json.status !== true)
return uploadError(json.error);
showImage(json.url);
}
}
ajax.open("POST", "upload.php", true);
ajax.send(formData); // send the form data
}
PHP
<?php
$host = 'localhost';
$user = 'user';
$password = 'password';
$database = 'database';
$mysqli = new mysqli($host, $user, $password, $database);
try {
if (empty($_FILES['image'])) {
throw new Exception('Image file is missing');
}
$image = $_FILES['image'];
// check INI error
if ($image['error'] !== 0) {
if ($image['error'] === 1)
throw new Exception('Max upload size exceeded');
throw new Exception('Image uploading error: INI Error');
}
// check if the file exists
if (!file_exists($image['tmp_name']))
throw new Exception('Image file is missing in the server');
$maxFileSize = 2 * 10e6; // in bytes
if ($image['size'] > $maxFileSize)
throw new Exception('Max size limit exceeded');
// check if uploaded file is an image
$imageData = getimagesize($image['tmp_name']);
if (!$imageData)
throw new Exception('Invalid image');
$mimeType = $imageData['mime'];
// validate mime type
$allowedMimeTypes = ['image/jpeg', 'image/png', 'image/gif'];
if (!in_array($mimeType, $allowedMimeTypes))
throw new Exception('Only JPEG, PNG and GIFs are allowed');
// nice! it's a valid image
// get file extension (ex: jpg, png) not (.jpg)
$fileExtention = strtolower(pathinfo($image['name'] ,PATHINFO_EXTENSION));
// create random name for your image
$fileName = round(microtime(true)) . mt_rand() . '.' . $fileExtention; // anyfilename.jpg
// Create the path starting from DOCUMENT ROOT of your website
$path = '/examples/image-upload/images/' . $fileName;
// file path in the computer - where to save it
$destination = $_SERVER['DOCUMENT_ROOT'] . $path;
if (!move_uploaded_file($image['tmp_name'], $destination))
throw new Exception('Error in moving the uploaded file');
// create the url
$protocol = stripos($_SERVER['SERVER_PROTOCOL'],'https') === true ? 'https://' : 'http://';
$domain = $protocol . $_SERVER['SERVER_NAME'];
$url = $domain . $path;
$stmt = $mysqli -> prepare('INSERT INTO image_uploads (url) VALUES (?)');
if (
$stmt &&
$stmt -> bind_param('s', $url) &&
$stmt -> execute()
) {
exit(
json_encode(
array(
'status' => true,
'url' => $url
)
)
);
} else
throw new Exception('Error in saving into the database');
} catch (Exception $e) {
exit(json_encode(
array (
'status' => false,
'error' => $e -> getMessage()
)
));
}
解决方案 29:
您可以使用 JavaScript 或 jQuery 进行异步多文件上传,而无需使用任何插件。您还可以在进度控制中显示文件上传的实时进度。我遇到了 2 个不错的链接 -
基于 ASP.NET Web 表单的多文件上传功能,带进度条
使用 jQuery 实现的基于 ASP.NET MVC 的多文件上传
服务器端语言是 C#,但您可以做一些修改使其与 PHP 等其他语言一起工作。
文件上传 ASP.NET Core MVC:
在View中创建html文件上传控件:
<form method="post" asp-action="Add" enctype="multipart/form-data">
<input type="file" multiple name="mediaUpload" />
<button type="submit">Submit</button>
</form>
现在在控制器中创建操作方法:
[HttpPost]
public async Task<IActionResult> Add(IFormFile[] mediaUpload)
{
//looping through all the files
foreach (IFormFile file in mediaUpload)
{
//saving the files
string path = Path.Combine(hostingEnvironment.WebRootPath, "some-folder-path");
using (var stream = new FileStream(path, FileMode.Create))
{
await file.CopyToAsync(stream);
}
}
}
hostingEnvironment 变量的类型为 IHostingEnvironment,可以使用依赖注入将其注入到控制器,例如:
private IHostingEnvironment hostingEnvironment;
public MediaController(IHostingEnvironment environment)
{
hostingEnvironment = environment;
}
解决方案 30:
尝试
async function saveFile()
{
let formData = new FormData();
formData.append("file", file.files[0]);
await fetch('addFile.do', {method: "POST", body: formData});
alert("Data Uploaded: ");
}
<span>File</span>
<input type="file" id="file" name="file" size="10"/>
<input type="button" value="Upload" onclick="saveFile()"/>
运行代码片段Hide results展开片段
浏览器会自动设置content-type='multipart/form-data'
,文件名也会自动添加到filename
FormData 参数中(服务器可以轻松读取)。以下是更详细的示例,其中包含错误处理和 json 添加
显示代码片段
async function saveFile(inp)
{
let user = { name:'john', age:34 };
let formData = new FormData();
let photo = inp.files[0];
formData.append("photo", photo);
formData.append("user", JSON.stringify(user));
try {
let r = await fetch('/upload/image', {method: "POST", body: formData});
console.log('HTTP response code:',r.status);
alert('success');
} catch(e) {
console.log('Huston we have problem...:', e);
}
}
<input type="file" onchange="saveFile(this)" >
<br><br>
Before selecting the file Open chrome console > network tab to see the request details.
<br><br>
<small>Because in this example we send request to https://stacksnippets.net/upload/image the response code will be 404 ofcourse...</small>
Run code snippetHide resultsExpand snippet
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件