1

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 アーカイブの制限ですか? 素朴で申し訳ありませんが、これまでにこれを行ったことはありません

4

2 に答える 2

0

zip ファイルを送信するには、OCTET ストリームを content-type として使用する必要があると思います。コードのもう 1 つの問題は、入力としてファイル名を使用していることです。ただし、ファイルを受信するには、ファイルの入力ストリームが必要です。また、ファイルの名前だけでなく、ファイルの内容も送信する必要があります。

ファイル メタデータや実際のファイル コンテンツなど、複数のフォーム パラメータをリクエストとともに送信する必要がある場合は、Multipart/form または Multipart/mixed コンテンツ タイプの使用を検討する必要があります。

これは、jersey フレームワークを使用してファイルを送信するための優れたチュートリアルです。使用しているフレームワークに関係なく、例から学習することができます。

http://www.mkyong.com/webservices/jax-rs/file-upload-example-in-jersey/

于 2013-07-26T17:15:54.150 に答える