ajax リクエストを使用して、複数のファイルを含む zip をクライアント側からサーバーに送信しようとしています。zip は JavaScript で Base64 文字列にエンコードされ、post パラメーターとして渡されます
Javascript コード:
var fileUp = document.getElementById("wsFile");
var file = fileUp.files[0];
var array = new Array();
array = file.name.split(".");
var reader = new FileReader();
reader.readAsDataURL(file);
if(array[array.length-1]=="zip" && file.size<=10000000){
var xhr = new XMLHttpRequest();
xhr.open("POST", "X",true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.onreadystatechange = function() {
if(xhr.readyState == 4 && xhr.status == 200) {
dojo.byId("content").innerHTML=xhr.responseText;
}
}
reader.onload = function(){
var params = "file="+ reader.result+"&fileName="+file.name;
xhr.send(params);
};
}
サーバー側 (Spring MVC):
@RequestMapping(value = "/X", method = RequestMethod.POST)
public String X(@RequestParam("file") String file, @RequestParam("fileName") String fileName, Locale locale, Model model) {
System.out.println(file);
byte[] decoded = Base64.decodeBase64(file);
System.out.println(decoded);
File folder = new File("C:\\MTT");
if(!folder.exists()){
folder.mkdir();
}
File f = new File("C:\\MTT\\"+fileName);
try {
FileOutputStream fos = new FileOutputStream(f);
fos.write(decoded);
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
これまでのところ、ajax リクエストは成功しており、サーバーはクライアントが送信したものと同じ Base64 文字列を受け取ります。ただし、zip 内のファイルを抽出しようとすると、破損したアーカイブ メッセージが表示されます。
何か間違ったことをしていますか、それとも zip アーカイブの制限ですか? 素朴で申し訳ありませんが、これまでにこれを行ったことはありません