Java Spring MVC загружает файл как байт [] - PullRequest
3 голосов
/ 15 декабря 2010

У меня следующая проблема.

У меня есть элемент управления 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 репутации:)

Спасибо, Дэнни.

1 Ответ

0 голосов
/ 15 декабря 2010

Я не знал о вашей клиентской стороне для отправки файла на сервер с HTTP.

Однако на стороне сервера вы можете проверить Spring MVC Multipart . А на стороне клиента отправка файла с Multipart - это еще один способ достижения вашей цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...