У меня следующая проблема.
У меня есть элемент управления ActiveX, написанный на C ++ / CLI, который я использую на стороне клиента.один из методов управления возвращает двоичный файл с фиксированным размером фрагмента (например, 1024).Этот файл заархивирован.
Мне нужно написать метод с использованием C ++ / CLI, который будет отправлять каждый кусок файла на сервер.У меня есть метод Java Spring MVC, который получает этот кусок байта [] и добавить его в файл.Другими словами, я просто загружаю почтовый файл кусками.
Моя проблема в том, что, хотя размер файла обоих файлов (Оригинал и его копия на сервере), контрольная сумма 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 содержала символы «+», после того, как запрос был отправлен на сервер, параметр chunk был URL-кодирован Spring, а все символы «+» были заменены пробелами, в результате файл zip был поврежден.Пожалуйста, верните мне мои +50 репутации:)
Спасибо, Дэнни.