2010-12-15 72 views
3

我有以下問題。Java Spring MVC上傳文件爲byte []

我有一個用C++/CLI編寫的ActiveX控件,我在客戶端使用它。其中一種控制方法通過固定塊大小(例如1024)返回二進制文件。這個文件被壓縮。

我需要使用C++/CLI編寫方法,它會將每個文件塊發送到服務器。我有Java Spring MVC方法接收這個byte []塊並將其附加到文件。換句話說,我只是通過塊上傳zip文件。

我的問題是,儘管這兩個文件(原始和它的服務器上的副本)的文件大小,該文件的MD5校驗和是不一樣的,我不能使用zip打開此文件。該文件已損壞。

我只是把每個塊的byte []使用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字符串有'+'個字符,在請求提交給服務器之後,chunk參數被Spring對URL進行了編碼,所有的'+'字符被空格替換,結果zip文件被損壞。請給我我的+50的聲譽:)

謝謝, 丹尼。

+0

標記已從「C++」更改爲「C++/CLI」。儘管在許多地方語法相似,但它們真的是不同的語言。與C++相比,C++/CLI與C#有更多共同之處。 – 2010-12-15 00:24:03

+0

我建議你嘗試上傳一個簡單的文件,然後使用base64的簡單文件,然後使用base64壓縮文件。過去我有base64編碼和解碼問題。這只是爲了確保base64相互轉換正確地發生在雙方。 – 2010-12-15 10:00:09

+0

如何在HTTP請求中發送字節數組而不使用base64進行編碼? – 2010-12-15 11:18:15

回答

0

我還沒有經歷過關於你的客戶端用HTTP發送文件到服務器的問題。

但是,在服務器端,您可以檢出Spring MVC Multipart。而在客戶端,發送文件Multipart是實現您的目標的另一種方式。

+0

好的,但我沒有上傳文件,但只是它的一部分作爲byte [],這就是爲什麼我沒有將它作爲多部分發送的原因。 – 2010-12-15 07:49:03

+1

問題解決了,請參閱我的上次更新。謝謝。 – 2010-12-20 23:00:44