我有以下问题。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的声誉:)
谢谢, 丹尼。
标记已从“C++”更改为“C++/CLI”。尽管在许多地方语法相似,但它们真的是不同的语言。与C++相比,C++/CLI与C#有更多共同之处。 – 2010-12-15 00:24:03
我建议你尝试上传一个简单的文件,然后使用base64的简单文件,然后使用base64压缩文件。过去我有base64编码和解码问题。这只是为了确保base64相互转换正确地发生在双方。 – 2010-12-15 10:00:09
如何在HTTP请求中发送字节数组而不使用base64进行编码? – 2010-12-15 11:18:15