現(xiàn)有的業(yè)務(wù)完全使用了前端Angular.JS的單頁應(yīng)用,所有請求均透過ajax發(fā)出。
現(xiàn)在我想實現(xiàn)在客戶端直接向又拍雲(yún)上傳文件,嘗試了angular file upload,但是提交的結(jié)果是
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?
我同時還有兩個疑問:
擁有18年軟件開發(fā)和IT教學(xué)經(jīng)驗。曾任多家上市公司技術(shù)總監(jiān)、架構(gòu)師、項目經(jīng)理、高級軟件工程師等職務(wù)。 網(wǎng)絡(luò)人氣名人講師,...
參考了這個issue
只要解決signature的安全問題,就可以成功上傳檔案了,謝謝大家。
解決方法:
hi 我先回答你後面的兩個問題:
signature 的簽名是包含form_api_secret
的,所以若在前端直接寫時,確實會存在安全問題:其他人拿到你的form_api_secret
,就可以自己寫表單把文件提交到你的空間,並使用你的流量了。
policy 能使用 base64 在前端產(chǎn)生。雖然 policy 是 encode 參數(shù)內(nèi)容,不存在安全問題,但因為 $signature = md5($policy.'&'.$form_api_secret);
,所以還是會有上面說的安全問題。
關(guān)於代碼的問題,已邀請 @PenaFong 來回答了。
http://stackoverflow.com/questions/24443246/angularjs-how-to-upload-multipart-form-data-and-a-file
http://uncorkedstudios.com/blog/multipartformdata-file-upload-with -AngularJS