现有的业务完全使用了前端Angular.JS的单页应用,所有请求均通过ajax发出。
现在我想实现在客户端直接向又拍云上传文件,尝试了angular file upload,但是提交的结果是
400: not accept, miss signature
抓包得知,policy和signature的表单数据根本没有提交。
我是这样写的:
$scope.onFileSelect = function ($files) {
var file = $files[0]; //这里我只传单个文件
$scope.upload = $upload.upload({
url: 'http://v0.api.upyun.com/youguess',
method: 'POST',
headers: {'Content-Type': 'multipart/form-data'},
data: {
signature: 'youguess',
policy: 'youguess'
},
fileFormDataName: 'file',
file: file,
formDataAppender: function (formData, key, value) {
if (angular.isArray(value)) {
angular.forEach(value, function(v) {
formData.append(key, v);
});
} else {
formData.append(key, value);
}
}
}).progress(function (event) {
console.log(parseInt(100.0 * event.loaded / event.total));
}).success(function (data, status, headers, config) {
console.log(data);
});
};
我参考了这个github项目的这个和这个issues
what should I do?
我同时还有两个疑问:
Merujuk isu ini
Selagi isu keselamatan tandatangan diselesaikan, fail boleh dimuat naik dengan jayanya. Terima kasih semua.
Penyelesaian:
hai Biar saya jawab dua soalan anda yang seterusnya dahulu:
Tandatangan
tandatangan termasuk
form_api_secret
, jadi jika anda menulisnya terus di bahagian hadapan, memang akan ada isu keselamatan: jika orang lain mendapatform_api_secret
anda, mereka boleh menulis borang mereka sendiri dan menyerahkan fail ke ruang anda dan menggunakan trafik anda.dasar boleh dijana pada bahagian hadapan menggunakan base64. Walaupun dasar ialah kandungan parameter pengekodan dan tiada isu keselamatan, tetapi disebabkan
$signature = md5($policy.'&'.$form_api_secret);
, isu keselamatan yang disebutkan di atas masih akan berlaku.Mengenai soalan kod, @PenaFong telah dijemput untuk menjawabnya.
Tandatangan dijana dengan meminta bahagian belakang seperti yang diperlukan, dan form_api_secret akan didedahkan apabila dikira pada bahagian hadapan
http://stackoverflow.com/questions/24443246/angularjs-how-to-upload-multipart-form-data-and-a-file
http://uncorkedstudios.com/blog/multipartformdata-file -muat naik-dengan-angularjs