2010-12-15 35 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