我有以下問題。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