2010-12-15 7 views
3

私は以下の問題があります。Java Spring MVCファイルをバイト[]としてアップロードする

私はクライアント側で使用しているC++/CLIで書かれたActiveXコントロールを持っています。制御方法の1つは、固定チャンクサイズ(例えば、1024)でバイナリファイルを返す。このファイルは圧縮されています。

私は、各ファイルチャンクをサーバに送るC++/CLIを使ってメソッドを書く必要があります。私はこのバイト[]チャンクを受け取ってファイルに追加するJava Spring MVCメソッドを持っています。つまり、私はちょうどチャンクでZIPファイルをアップロードしています。

私の問題は、両方のファイル(元とそのサーバー上のコピー)のファイルサイズは同じですが、このファイルのMD5チェックサムは同じではなく、このファイルをzipで開くことができないということです。ファイルが壊れています。

私はちょうど[] BASE64でそれを変換し、私の定期的なPOSTリクエストを使用してサーバに送信し、各チャンクのバイトを取っている:

私のコードは以下の通りです:

int SceneUploader::AddChunk(int id, array<Byte> ^buffer,int size){ 
WebRequest^ request = WebRequest::Create(AddChunkURI); 
request->Method = "POST"; 
request->ContentType = "application/x-www-form-urlencoded"; 
System::String ^base64Image = Convert::ToBase64String(buffer); 
String ^param = "id="+id+"&chunk="+base64Image+"&len="+size; 

//Just make another copy of the file to verify that sent byted are ok!!! 
String ^path = "C:\\Users\\dannyl\\AppData\\Local\\Temp\\test.zip"; 
FileStream ^MyFileStream = gcnew FileStream(path, FileMode::Append, FileAccess::Write); 
MyFileStream->Write(buffer,0,size); 
MyFileStream->Close(); 
//Adding the byteArray to the stream. 
    System::IO::Stream ^stream = request->GetRequestStream(); 
    System::IO::StreamWriter ^streamWriter = gcnew System::IO::StreamWriter(stream); 
    streamWriter->Write(param); 
    streamWriter->Close(); 
    HttpWebResponse^ response = dynamic_cast<HttpWebResponse^>(request->GetResponse()); 
    Stream^ dataStream = response->GetResponseStream(); 
    StreamReader^ reader = gcnew StreamReader(dataStream); 
    String^ responseFromServer = reader->ReadToEnd(); 
    return System::Int32::Parse(responseFromServer); 
} 

私のMVCコントローラのルックスこのように:

@RequestMapping(value="/addChunk.dlp",method = RequestMethod.POST) 
     @ResponseBody 
     public String addChunk(@RequestParam("id") String id, 
       @RequestParam("chunk") String chunk, 
       @RequestParam("len") String len){ 
      try{ 
       BASE64Decoder decoder = new BASE64Decoder(); 
       Integer length = Integer.decode(len); 
       byte[] decodedBytes = new byte[length]; 
       decodedBytes = decoder.decodeBuffer(chunk.trim()); 
       File sceneFile = new File(VAULT_DIR+id+".zip"); 
       if (!sceneFile.exists()){ 
        sceneFile.createNewFile(); 
       } 
       long fileLength = sceneFile.length(); 
        RandomAccessFile raf = new RandomAccessFile(sceneFile, "rw"); 
        raf.seek(fileLength);    
        raf.write(decodedBytes); 
        raf.close();     
      } 
      catch(FileNotFoundException ex){ 
      ex.getStackTrace(); 
      System.out.println(ex.getMessage()); 
      return "-1"; 
      } 
      catch(IOException ex){ 
       ex.getStackTrace(); 
       System.out.println(ex.getMessage()); 
       return "-1"; 
       } 

      return "0"; 
     } 

私は間違っていますか?

更新:問題が解決しました。元のBase64文字列は '+'文字で、要求がサーバーに送信された後、チャンクパラメータがSpringによってURLでデコードされ、すべての '+'文字がスペースで置換されたため、zipファイルが破損していました。私の評判の+50を返してください:)

ありがとう、 ダニー。

+0

タグが「C++」から「C++/CLI」に変更されました。多くの場所で同様の構文にもかかわらず、これらは実際には異なる言語です。 C++/CLIは、C++よりもC#と共通しています。 –

+0

単純なファイルをアップロードしてから、単純なファイルをbase64で、次に圧縮したファイルをbase64でアップロードすることをお勧めします。私は過去にbase64エンコーディングとデコードの問題を抱えていました。これは、base64の相互変換が両側で正しく行われていることを確認することです。 –

+0

バイト配列をbase64でエンコードせずにHTTPリクエストでどのように送ることができますか? –

答えて

0

HTTPを使用してサーバーにファイルを送信しているクライアント側について、私は経験していません。

サーバー側では、Spring MVC Multipartをチェックアウトすることができます。そしてクライアント側では、Multipartでファイルを送信することは、あなたの目標を達成する別の方法です。

+0

しかし、私はファイルをアップロードしていませんが、バイト[]としてそれをちょうど塊にするので、これがマルチパートとして送られなかったのです。 –

+1

問題は解決しました。私の最後の更新を参照してください。ありがとうございました。 –

関連する問題