问题描述
没有使用任何形式,我可以使用 jQuery 使用 POST 方法将文件/文件从<input type="file">
发送到’upload.php’ 。输入标签不在任何表单标签内。它独立地站立。所以我不想使用像’ajaxForm’ 或’ajaxSubmit’ 这样的 jQuery 插件。
最佳解决方案
您可以使用 FormData 通过 POST 请求提交数据。这是一个简单的例子:
var myFormData = new FormData();
myFormData.append('pictureFile', pictureInput.files[0]);
$.ajax({
url: 'upload.php',
type: 'POST',
processData: false, // important
contentType: false, // important
dataType : 'json',
data: myFormData
});
只要知道您的请求设置 (如 url,方法和参数数据),您就不必使用表单来制作 ajax 请求。
次佳解决方案
基于 this tutorial,这是一个非常基本的方法:
$('your_trigger_element_selector').on('click', function(){
var data = new FormData();
data.append('input_file_name', $('your_file_input_selector').prop('files')[0]);
// append other variables to data if you want: data.append('field_name_x', field_value_x);
$.ajax({
type: 'POST',
processData: false, // important
contentType: false, // important
data: data,
url: your_ajax_path,
dataType : 'json',
// in PHP you can call and process file in the same way as if it was submitted from a form:
// $_FILES['input_file_name']
success: function(jsonData){
...
}
...
});
});
不要忘记添加正确的错误处理
第三种解决方案
这里的所有答案仍在使用 FormData API 。它就像没有表单的表单文件上传。您还可以使用 xmlHttpRequest
直接将文件上传到 POST
请求的正文内,如下所示:
var xmlHttpRequest = new XMLHttpRequest();
var file = ...file handle...
var fileName = ...file name...
var target = ...target...
var mimeType = ...mime type...
xmlHttpRequest.open('POST', target, true);
xmlHttpRequest.setRequestHeader('Content-Type', mimeType);
xmlHttpRequest.setRequestHeader('Content-Disposition', 'attachment; filename="' + fileName + '"');
xmlHttpRequest.send(file);
Content-Type
和 Content-Disposition
标头用于说明我们发送的内容 (mime-type 和文件名) 。
我也发贴类似的答案也是 here 。
第四种方案
步骤 1:创建 HTML 页面放置 HTML 代码。
步骤 2:在 HTML 代码页面底部 (页脚) 创建 Javascript:并将 Jquery 代码放在脚本标签中。
步骤 3:创建 PHP 文件和 PHP 代码复制过去。在 $.ajax
中的 Jquery 代码之后,代码 url 应用您的 php 文件名称中哪一个。
JS
//$(document).on("change", "#avatar", function() { // If you want to upload without a submit button
$(document).on("click", "#upload", function() {
var file_data = $("#avatar").prop("files")[0]; // Getting the properties of file from file field
var form_data = new FormData(); // Creating object of FormData class
form_data.append("file", file_data) // Appending parameter named file with properties of file_field to form_data
form_data.append("user_id", 123) // Adding extra parameters to form_data
$.ajax({
url: "/upload_avatar", // Upload Script
dataType: 'script',
cache: false,
contentType: false,
processData: false,
data: form_data, // Setting the data attribute of ajax with file_data
type: 'post',
success: function(data) {
// Do something after Ajax completes
}
});
});
HTML
<input id="avatar" type="file" name="avatar" />
<button id="upload" value="Upload" />
腓
print_r($_FILES);
print_r($_POST);
第五种方案
对不起,那个人,但 AngularJS 提供了一个简单而优雅的解决方案。
这是我使用的代码:
ngApp.controller('ngController', ['$upload',
function($upload) {
$scope.Upload = function($files, index) {
for (var i = 0; i < $files.length; i++) {
var file = $files[i];
$scope.upload = $upload.upload({
file: file,
url: '/File/Upload',
data: {
id: 1 //some data you want to send along with the file,
name: 'ABC' //some data you want to send along with the file,
},
}).progress(function(evt) {
}).success(function(data, status, headers, config) {
alert('Upload done');
}
})
.error(function(message) {
alert('Upload failed');
});
}
};
}]);
.Hidden {
display: none
}
<script src="https://googleajax.admincdn.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script src="https://googleajax.admincdn.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div data-ng-controller="ngController">
<input type="button" value="Browse" onclick="$(this).next().click();" />
<input type="file" ng-file-select="Upload($files, 1)" class="Hidden" />
</div>
在服务器端,我有一个带有动作的 MVC 控制器,保存在 Request.Files 集合中发现的文件,并返回一个 JsonResult 。
如果你使用 AngularJS 尝试这个,如果你不… 对不起,伴侣:-)
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。