문제

나는 작은 응용 프로그램을 이용할 것입 업로드 및 다운로드 파일하다.추가했 웹 서비스를 이 applciation 을 제공하는 업로드/다운로드 하는 기능을 방지만 내가 너무 확인에 얼마나 잘 나의 구현은 대형 파일이 있습니다.

에서는 순간의 정의는 업로드 및 다운로드 방법은 다음과 같이(아파치 사용하여 작성 기술설):

boolean uploadFile(@WebParam(name = "username") String username,
    @WebParam(name = "password") String password,
    @WebParam(name = "filename") String filename,
    @WebParam(name = "fileContents") byte[] fileContents)
    throws UploadException, LoginException;

byte[] downloadFile(@WebParam(name = "username") String username,
    @WebParam(name = "password") String password,
    @WebParam(name = "filename") String filename) throws DownloadException,
    LoginException;

그래서 파일을 업로드 및 다운로드 바이트 배열로.하지만 만약 내가 파일의 바보 같은 크기(예:1GB)반드시 이 시도하고 모든 정보를 메모리 충돌을 내 서비스입니다.

그래서 제 질문은-그것은 가능한 가 반환하는 어떤 종류의 스트림에 대?내가 상상이 될 수 없습니다 정말 OS 에 독립적지만.알고 있지만 이론을 뒤 웹 서비스의 실제적인 측면 뭔가가 나는 아직도 선택해야의 비트에 대한 정보.

환호를 위해 어떤 입력 리

도움이 되었습니까?

해결책

스티븐 Denne 는 지하철 구현을 충족하는 귀하의 요구 사항입니다.나의 답변이 아래에 제공된 후에는 짧은 explination 는 이유에는 경우입니다.

대부분의 웹 서비스 구현을 기본 제공되는 HTTP 를 사용하여 메시지 프로토콜은 나머지를 준수하고,그들이만 허용한 간단한 송수신 패턴과 아무것도 없습니다.이것은 크게 향상 상호 운용성,대로 모든 다양한 플랫폼을 이해할 수 있는 이 간단한 구조(예를 들어 Java 웹서비스 이야기.NET 웹 서비스).

을 유지하려는 경우 이를 제공할 수 있습 청크.

boolean uploadFile(String username, String password, String fileName, int currentChunk, int totalChunks, byte[] chunk);

이 필요한 것이 몇 가지 자세는 경우에 당신을 얻을 하지 않 덩어리를 올바른 순서(또는 당신할 수 있습만을 필요로 덩어리를 올바른 순서),하지만 그것은 아마 매우 쉽게 구현할 수 있습니다.

다른 팁

네,그것이 가능한 제공합니다.보 대형 첨부 파일 예제는 다음과 같은 그것을 당신이 원하는 않습니다.

JAX-WS RI 에 대한 지원을 제공합 보내고 받는 대형 첨부 파일을 스트리밍 패션이다.

  • 사용딩을 지정합니 그 때마에서 프로그래밍 모델을 사용합니다.
  • 캐스팅을 때마 StreamingDataHandler 및 사용 방법이 있습니다.
  • 는지 확인을 통 StreamingDataHandler.close()및 또한 StreamingDataHandler.readOnce()니다.
  • 사용 HTTP 청크는 클라이언트에서만 가능합니다.

할 때 사용하는 표준화된 웹 서비스를 송신자와 수신기행에 의존하고의 무결성 XML 데이터에서 보내는 다른 하나.이 의미는 웹 서비스 요청과 응답만을 완료 할 때 지난 태그가 전송되었습니다.이 마음에서는 웹 서비스로 취급될 수 없습니다.

이것은 논리적이기 때문에 표준화된 웹 서비스에 의존하는 http 프로토콜입니다.하나는"stateless",그것을 말할 것이 작동 다음과 같"열려있는 연결을 할 수 있습니다.요청을 보내...데이터 수신...가까운 요청".연결이 닫힌 끝입니다.그래서 뭔가 좋아 스트리밍은 사용되지 않습니다 여기에.나 그는 계층 위 http(같은 웹 서비스).

그래서 죄송하지만 지금까지 내가 볼 수있는 가능성은 없는 스트리밍서는 웹 서비스를 사용하고 있습니다.더:에 따라 구현/구성의 웹 서비스,byte[]-할 수 있는 데이터를 번역하 Base64 지 CDATA 태그와 요청을 얻을 수 있습니다 더욱 부상했다.

P.S.:Yup,다른 사람으로 쓴"chuinking"이 가능합니다.그러나 이것은 없는 스트리밍 등;-)-어쨌든,그것은 당신을 도움이 될 수 있습니다.

나는 증오려는 당신의 사람들을 생각하는 스트리밍 웹 서비스 가능하지 않은,그러나 현실에서,모든 http 요청이 있는 스트림을 기반으로합니다.모든 브라우저을 얻 웹 사이트 스트림을 기반으로합니다.모든 통화를 웹서비스 스트림을 기반으로합니다.Yes,니다.우리는 주의하지 않는 이 레벨에서 우리를 구현하는 서비스 또는 페이기 때문에 더 낮은 수준의 제공을 다루고 이 당신을 위해-그러나 그것이 행해지고 있다.

당신은 이제까지 주는 브라우저에서 때때로 그것은 시간이 걸릴 수 있습니다 페이지 가져오기-브라우저는지를 본격 멀리 보여주는 모래?는 것이기 때문에 브라우저를 기다리고 있습니다.

스트림은 이유는 mime/형식가를 보내기 전에 실제 데이터-그것은 모두 그냥 바이트 스트림을 브라우저에,그것은 없을 식별할 수 있는 사진 경우를 말하지 않았다 그것은 무엇이었다 처음이다.그것은 또한 당신은 왜을 통과해야의 크기는 바이너리로 보내기 전에 브라우저 할 수 없게 이미지를 정지하고 페이지를 선택합니다.

그것은 그냥 바이트 스트림을 클라이언트입니다.당신이 원하는 경우 이를 증명하기 위해 자신을 위해,다만의 보류를 얻을 출력 스트림에서 어떤 시점에서 요청의 처리 및 close()니다.당신이 모든 것입니다.브라우저는 즉시 정지 표시 모래,그리고 표시됩니다"찾을 수 없습니다"또는"다시 연결 서버에서"또 다른 이러한 메시지입니다.

는 많은 사람들이 알지 못하는 이 모든 것들이 스트림을 기반으로 보여줍니다 그냥 얼마나 많은 물건이었의 최상위 계층에 있습니다.일부는 말할 것이 너무 많은 물건 나는 그 중 하나입니다.

행운과 행복 개발-휴식을 그 어깨!

WCF 생각이 가능 정의 구성원에 메시지로 스트림을 설정하고 바인딩 적절하게 봤어요 이와 함께 작동 wcf 이야기를 Java 웹 서비스입니다.

을 설정해야 합 transferMode="StreamedResponse"에 httpTransport 구성 및 사용 mtomMessageEncoding(을 사용할 필요가 맞춤 바인딩 섹션에 설정).

나는 하나라고 생각한 제한할 수 있는 단 하나의 메시지 본문원고 싶다면 스트림(는 종류의 의미가).

아파치 기술설 전송 및 수신을 지원 스트림이 있습니다.

방법 중 하나 그것을 하 추가 uploadFileChunk(byte[]chunkData,int 크기,int offset,int totalSize)method(또는)는 업로드 부품의 파일을 서버에 기록하는 디스크에 있습니다.

유지 하는 마음에는 웹 요청을 서비스는 기본적으로 귀결하는 단일 HTTP POST.

에서 보면의 출력.ASMX 파일에서.순,그것은 정확히 무엇을 보여줍 POST 요청과 응답에 다음과 같다.

청크로@Guvante,이 될 것입니다 가장 가까운 것은 당신이 무엇을 원합니다.

나는 가정을 구현할 수 있습니다 당신의 자신의 웹 클라이언트를 처리하는 코드는 TCP/IP 스트림 것으로의 응용 프로그램,하지만 하는 것이 복잡합니다.

나는 생각을 사용하여 간단한 servlet 이 작업에는 것이 훨씬 쉽게 접근,또는 어떤 이유로 사용할 수 없 servlet?

예를 들어 사용할 수 있습니다 Commons 오픈 소스 라이브러리입니다.

RMIIO 라이브러리 Java 제공해 주 RemoteInputStream 에 RMI-우리는 필요한 RMI,하지만 당신이해야에 적응할 수 있는 코드를 작업을 통해 다른 유형의 RMI.이 도움이 될 수 있을-특히 가질 수 있다면 작은 응용 프로그램 사용자 측에서.라이브러리 개발되었으로 표현할 수 있도록 제한하는 데이터의 크기가 밀려하기 위해 서버 정확히 입력의 상황을 설명합-효과적으로 DOS 공격에 의해 작성 ram 또는 디스크에 있습니다.

로 RMIIO 라이브러리,서버측을 얻는 방법을 결정하는 데이터는 그것이 기꺼이하는 HTTP 넣고 게시물을 클라이언트에 가져오는 결정을 포함하여 평가에서는 밀.

Yes,웹 서비스 할 수 있습니다.내가 만든 웹 서비스를 사용하여 아파치 Axis2 및딩을 지정합을 지원하는 PDF 문서를 렌더링에서 XML.이후 생성된 결과 파일이 될 수 있습니다,큰 스트리밍이었다 중요한 것을 하지 않았기 때문에 그것을 유지하려는 모든 메모리에 있습니다.을 살펴 오라클의 documentation 스트리밍 비누 첨부 파일이 있습니다.

또는,당신이 그것을 할 수 있습,그리고 톰캣을 만들 것입할 헤더가 있습니다.이 예제의 스프링 컨트롤러는 기능 스트림이 있습니다.

 @RequestMapping(value = "/stream")
        public void hellostreamer(HttpServletRequest request, HttpServletResponse response) throws CopyStreamException, IOException  
{

            response.setContentType("text/xml");
            OutputStreamWriter writer = new OutputStreamWriter (response.getOutputStream());
            writer.write("this is streaming");
            writer.close();

    }

그것은 실제로 어렵지 않을"처리 TCP/IP 스트림 것으로의 응용 프로그램"입니다.이 시도...

class MyServlet extends HttpServlet
{
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    {
        response.getOutputStream().println("Hello World!");
    }
}

는 모든이 거기에 있습니다.당신은,위 코드에서는 반응 HTTP GET 요청을 보내는 브라우저에서,그리고 반환하는 브라우저의 텍스트"Hello World!".

마음에서"Hello World!"유효하지 않은 HTML,그래서 당신은 끝낼 수 있습니다에서 오류가 브라우저지만,정말로 모든 거기에 있다.

행운에서 당신의 개!

로드니

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top