그래서 상황은 다음과 같습니다. 자바 스윙 응용 프로그램에서 spring 웹 응용 프로그램을 실행중인 glassfish 4 서버로 파일을 성공적으로 업로드 할 수 있습니다.느린 파일 업로드 속도 글래스 피시의 httpclient에서 봄 mvc
내 문제는 업로드하는 데 영원히 걸립니다 !!! 웹에서 속도를 높이거나 낮추는 데 많은 요소가 있다는 것을 알고 있습니다. 난 단지 내 코드가 느린 지점이 아닌지 확인하고 싶다. 1.7MB의 내 테스트 파일에 대해
, 그것은 업로드에 대한 14초 평균 소요됩니다. 내 ISP에 따르면 megapath 속도 테스트에 의해 확인, 나는 매우 일관된 50 MB/s 연결을 두 가지 방법으로있다.
파일 업로드와 관련하여 동일한 작업을 수행하는 데는 여러 가지 방법이 있습니다. 나는 UI 개발자이고 파일 xfer는 나를 위해 새 것 ... 나는 업로드 프로세스가 작동하기에 충분한 시간을 가졌다. 문제 해결/최적화를 시작할 위치를 어디서 찾아야할지 모르겠다.
들어오는 파일을 처리하는 스프링 컨트롤러의 관련 메서드는 물론 클라이언트에서 파일을 보내는 코드도 포함 시켰습니다. (아파치의 HTTP 클라이언트 라이브러리를 사용하여, 클라이언트 코드)
CloseableHttpClient httpclient = HttpClients.createDefault();
long start = System.currentTimeMillis();
// request bean to JSON string
ObjectMapper mapper = new ObjectMapper();
String requestBeanAsJSON = mapper.writeValueAsString(requestBeanToSend);
HttpPost outgoingPostRequest = new HttpPost(serverURL);
FileBody fileBody = new FileBody(fileToSend, ContentType.DEFAULT_BINARY);
StringBody stringBody1 = new StringBody("msg", ContentType.MULTIPART_FORM_DATA);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addPart("upfile", fileBody);
builder.addPart("text1", stringBody1);
HttpEntity entity = builder.build();
outgoingPostRequest.setEntity(entity);
CloseableHttpResponse responseBody = httpclient.execute(outgoingPostRequest);
long end = System.currentTimeMillis();
System.out.println("completed in " + ((end-start)/1000) + " seconds.");
(서버 코드를 (필자는 파일과 함께 JSON의 형태로 파일에 대한 메타 데이터를 전송하고 있음을 유의하시기 바랍니다) 봄, glassfish4)
@RequestMapping(method = RequestMethod.POST, value = "up")
public @ResponseBody MyReturnObject handleFileUpload(@RequestParam("file") MultipartFile file)
{
try
{
BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(new File(FtConstants.getTempUploadBaseDir() + File.separator + uniqueToken + "." + FileUtils.getFileExtension(file.getOriginalFilename()))));
FileCopyUtils.copy(file.getInputStream(), stream);
stream.close();
}
catch(Exception e)
{
}
MyReturnObject returnObject = new MyReturnObject();
returnObject.setToken( RandomStringUtils.randomAlphanumeric(16));
return returnObject;
}
은 아무것도 내가 잘못 것을 눈부신 있습니까? 내가 위에서 말했듯이, 그것은 효과가 있지만 사악하다.
미리 도움을 청하십시오!
왜 파일을 복사하기 위해'BufferedOutputStream'을 사용하고 있습니까? 'FileCopyUtils.copy (file.getInputStream(), new FileOutputStream ("theCopiedFile.txt")); 또는 단순히'copy (byte [] in, File out)'메서드 만 수행 할 수 있습니까? – Jaumzera
@Jaumzera - 그다지 큰 차이는 없습니다. –
@Stephen C, 여기 내 테스트에 따르면 BufferedOuputStream이 214MB 파일을 복사하는 데 500 밀리 초 (평균)가 걸리지 만 비 버퍼링 된 대체 방법을 사용하면 50 밀리 초가 소요됩니다. 나는 10x가 관련이 있다고 생각한다. 그렇지 않니? 물론 내 하드웨어 사양을 고려하십시오. – Jaumzera