Загрузка двоичных файлов на сервер Linux с использованием HTTP и MIME

#java #linux #http #mime

Вопрос:

Я пишу приложение для архивирования файлов любого типа на сервер Linux. Получив запрос на публикацию с веб-страницы, клиент, в свою очередь, отправляет составной запрос MIME на сервер, который создает и сохраняет файл.

В то время как текстовые файлы архивируются идеально, любые двоичные файлы (документы Word, jpeg, чертежи Visio и т.д.) Повреждены и не могут быть открыты при загрузке обратно на компьютер с Windows.

(Windows) клиентский код для загрузки файла:

 protected void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  String responseBody = "";   if (ServletFileUpload.isMultipartContent (request))  {  try  {  FileItemFactory factory = new DiskFileItemFactory ();  ServletFileUpload upload = new ServletFileUpload (factory);  Listlt;FileItemgt; fields = upload.parseRequest (request);   for (FileItem field : fields)  {  if (field.getFieldName ().equals ("resource"))  {  JSONObject requestObj = new JSONObject (); // request body  requestObj.put ("fileName", field.getName ());  requestObj.put ("contentType", field.getContentType ());   byte[] b = field.getString ().getBytes ();   CloseableHttpClient httpClient = HttpClients.createDefault ();  HttpPost httpPost = new HttpPost ("192.168.0.1/myApp");  MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create ();  multipartEntityBuilder.addTextBody ("src", requestObj.toString ());  multipartEntityBuilder.addBinaryBody ("resource", requestBinary);  HttpEntity entity = multipartEntityBuilder.build ();  httpPost.setEntity (entity);  CloseableHttpResponse httpResponse = httpClient.execute (httpPost);  responseBody = EntityUtils.toString (httpResponse.getEntity ());  httpResponse.close ();  httpClient.close ();  }  }  }  catch (Exception e)  {  System.out.println (e.getClass.getName ()   " : "   e.getMessage ());  responseBody = e.getMessage ();  }  }   response.setContentType ("text/html");  PrintWriter pw = response.getWriter ();  pw.append (responseBody); }  

Серверный код на базе Linux является:

 protected void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  String responseBody = "";  if (ServletFileUpload.isMultipartContent (request))  {  try  {  FileItemFactory factory = new DiskFileItemFactory ();  ServletFileUpload upload = new ServletFileUpload (factory);  Listlt;FileItemgt; fields = upload.parseRequest (request);   String fileName = "";  String contentType = "";  InputStream is = null;  for (FileItem field : fields)  {  if (field.getFieldName ().equals ("src"))  {  JSONObject requestObj = (JSONObject) jsonParser.parse (field.getString ());  fileName = (String) requestObj.get ("fileName");  contentType = (String) requestObj.get ("contentType");  }  else if (field.getFieldName ().equals ("resource"))  {  is = field.getInputStream ();  }  }   File file = new File ("/myPath/"   fileName);  if (file.exists ())  {  file.delete ();  }   file.createNewFile ();   OutputStream os = null;  DataOutputStream dos = null;  FileOutputStream fos = new FileOutputStream (file);  if (contentType.contains ("text"))  {  os = fos;  }  else  {  dos = new DataOutputStream (fos);  os = dos;  }   int bufferSize = 4096;  byte[] buffer = new byte[bufferSize];  int readCount = 0;  while ((readCount = is.read (buffer)) != -1)  {  os.write (buffer, 0, bufferSize);  }  os.close ();  is.close ();   responsebody = "Success!";  }  }  catch (Exception e)  {  System.out.println (e.getClass.getName ()   " : "   e.getMessage ());  responseBody = e.getMessage ();  }   response.setContentType ("text/html");  PrintWriter pw = response.getWriter ();  pw.append (responseBody); }  

Я не получаю сообщений об ошибках, и, похоже, все работает нормально. Какой конец соединения (клиент или сервер) повреждает загруженный файл и как мне лучше всего это решить? Заранее спасибо.

Комментарии:

1. При расследовании ответственность несет клиентская сторона: field.getString. длина () = 216503 байта, но поле.getString. Тобайты. длина = 309888 байт.