私は以下の問題があります。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を返してください:)
ありがとう、 ダニー。
タグが「C++」から「C++/CLI」に変更されました。多くの場所で同様の構文にもかかわらず、これらは実際には異なる言語です。 C++/CLIは、C++よりもC#と共通しています。 –
単純なファイルをアップロードしてから、単純なファイルをbase64で、次に圧縮したファイルをbase64でアップロードすることをお勧めします。私は過去にbase64エンコーディングとデコードの問題を抱えていました。これは、base64の相互変換が両側で正しく行われていることを確認することです。 –
バイト配列をbase64でエンコードせずにHTTPリクエストでどのように送ることができますか? –