如何使用Angularjs中的ng-file上传库以二进制格式上传文件?

时间:2017-01-24 08:01:29

标签: javascript angularjs amazon-s3 ng-file-upload

我使用AngularJs的预签名网址将文件上传到Amazon S3 Bucket。打开下载的文件时Zip文件损坏。当我以二进制格式从邮递员上传文件时,它按预期工作。

enter image description here

我在angularjs中使用ng-file-upload库。对于每个下载的文件,包含web-kit表单边界,如下所示:

enter image description here

如果我们编辑并删除web-kit表单边界并尝试打开相同的文件,那么它将完全打开。

1 个答案:

答案 0 :(得分:1)

我在一周前遇到了同样的问题,我提出的唯一解决方案是编写自己的代码,通过http请求发送文件。随意使用示例:

function azureChangeFn() {
			var inputElement = document.getElementById("fileSelect");
			var newFile = inputElement.files[0];
			var url = "https://YOUR_STORAGE_NAME.blob.core.windows.net/CONTAINER_NAME/"+ newFile.name +"GENERATED_SharedAccessSignature_FROM_AZURE_SITE";
			
			var xhr = new XMLHttpRequest();
			xhr.addEventListener("progress", updateProgress);
			xhr.onreadystatechange = function() {
				if (xhr.readyState == XMLHttpRequest.DONE) {
					alert("Sent to azure storage service!");
				}
			}
			xhr.open('PUT', url, true);
			xhr.setRequestHeader("Content-type", "multipart/form-data");
			xhr.setRequestHeader("lng", "en");
			xhr.setRequestHeader("x-ms-blob-type", "BlockBlob");
			xhr.setRequestHeader("x-ms-blob-content-type", newFile.type);
			xhr.send(newFile);
		}
		
		function updateProgress (oEvent) {
		  if (oEvent.lengthComputable) {
			var percentComplete = oEvent.loaded / oEvent.total;
			console.log(percentComplete);
		  } else {
			alert('FAIL');
		  }
		}
<html>

<head>
</head>

<body>
		<label>Example without library:</label>
		<br>
		<label>Select file: <input type="file" id="fileSelect" onchange="azureChangeFn()"></label>
		
		
</body>
</html>

谈到ng-file-upload库,在源代码中我发现 formData.append 方法在附加文件时,自动添加web-kit头。据我所知,FormData用于POST方法,但在使用PUT时,所有正文都被视为文件。遗憾的是,我无法使用POST方法将文件上传到azure存储。