2012-05-28 4 views
0

우리 프로젝트에서 우리는 일부 파일을 저장하고 있습니다. 파일이 요청되면 HBase 테이블에서 파일을 가져온 다음 브라우저로 보냅니다.파일 보내기가 더 좋음 또는 출력 스트림

데이터가 HBase의 바이트로 저장됩니다. 그래서 파일을 가져올 때 바이트로 가져옵니다.

이제이 Bytes를 File 객체 또는 Output Stream으로 변환해야합니다.

내가 알고 싶은 것은 File 객체를 통해 파일을 보내거나 출력 스트림을 전송하는 것입니다.

파일 크기는 1MB에서 10 MS까지 다양합니다.

데이터를 보내기 위해 REST API를 사용하고 있습니다.

+0

정말 중요한가요?파일을 보내려면 파일이 필요하지 않을 것입니다. 전송할 파일을 만들려면 많은 수의 입출력을 의미하며, 그러면 그냥 사라지게 될 것입니다. –

답변

1

매우 특수한 이원 객체이 이 될 것이므로 java.io.File 객체를 보내면 수신 시스템이 자바로되어 있어야합니다.

귀하는 언급했듯이 을 (를) 사용하여 REST을 사용하고 있습니다. 이제 이것은 어떤 기술/플랫폼과도 무관 한 무언가를 요구합니다..

하나의 가능한 접근법은 다음과 같습니다.

  1. 나머지 API는 다운로드하려는 파일을 가리키는 URL을 반환합니다. 이 URL은
  2. Write/Configure a Servlet입니다.
  3. 이 서블릿이 요청을 받으면 데이터베이스를 읽고 응답 스트림 (출력 스트림)에 씁니다.
  4. 사용자가 파일 다운로드를 요청하는 메시지가 나타납니다.

여기 서블릿을 사용하는 example of PDF file download입니다.

+0

파일 보내기는 단지 시간 낭비 일뿐입니다 * 파일 이름 일 뿐이며 작성한 서버에서만 의미가 있습니다. – EJP

1

실제로 무엇을하고 있는지 명확하게 알 수는 없지만 java.io.File은 경로를 통한 추상화에 불과하므로 데이터가 전혀 포함되어 있지 않습니다. 따라서, 나는 당신이하고 싶은 것이 실제 파일 내용을 보내는 것이라면 java.io.File 객체를 보내는 것이 어떤 식 으로든 도움이 될 것이라고 생각하지 않는다.

주어진 싱크로 바이트 흐름을 제어하는 ​​클래스 인 OutputStream을 보내지 마십시오. 보내 주신 내용은 스트림이 아닌 바이트입니다 (예 : 싱크가 소켓 인 경우 해당 싱크와 연결된 OutputStream을 사용하여 파일 내용의 바이트를 소켓을 통해 전송하는 것이 좋습니다).

+0

그건 내 의견으로는 사실이 아닙니다. 이미지를 REST를 통해 파일 객체로 보내고 있으며 브라우저에서 이미지를 볼 수 있습니다. – JHS

+0

이것은 의미론입니다. –

+1

@Juniad * 이미지를 REST를 통해 파일 객체로 보내고 있으며 브라우저에서 볼 수 있습니다. * 당신은 무엇으로보고 있습니까? 1. 이미지로 표시된 이미지. 2. URL을 가리키는 이미지 src. 3. 다른 것. 다른 네트워크에서 REST API를 호출하고 작동하는지 테스트합니다. –

1

OuputStream에 직접 쓰는지 또는 바이트 []를 로컬 파일에 먼저 저장할지 묻는 질문이 있다고 가정합니다. 로컬 파일을 먼저 저장한다고 생각할 수있는 유일한 이유는 HBase의 검색과 사용자의 다운로드를 분리하기 위해서입니다. HBase의 byte []를 반환하는 각 요청이 응답에서 전체 파일을 사용자에게 반환한다고 예상 할 경우 OutputStream을 사용하십시오.

10MB를 바이트 []로 검색하면 요청 당 많은 메모리가 소모되는 것처럼 보입니다. HBase가 InputStream을 제공하도록 요청할 수 있으므로 요청 당 최대 10MB RAM이 필요하지 않을 수 있습니다.