#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 байт.