2013-02-13 12 views
9

मैं जावा जेडीके 1.7 और जर्सी वेब सेवा फ्रेमवर्क का उपयोग कर एक वेब सेवा लिख ​​रहा हूं। मुझे प्रदान करने की ज़रूरतों में से एक है प्रमाणीकृत ग्राहकों को कुछ बड़ी डेटा फ़ाइलों (1-3 जीबी) डाउनलोड करने की अनुमति देने का एक तरीका है। आदर्श रूप में मैं इसे एक विराम और फिर से शुरू करने के प्रकार डाउनलोड करने योग्य विकल्प होना चाहता हूं। मैंने जर्सी मल्टी-पार्ट एपीआई की कोशिश की और 400 एमबी तक मेरी क्लाइंट मशीन पर काम करने में सक्षम था, लेकिन उससे परे यह मेमोरी के मुद्दों से बाहर हो गया। मैं भी चिंतित हूं कि एक साथ डाउनलोड अनुरोधों का सामना करते समय सर्वर विफल हो सकता है। इस पर कोई विचार कैसे किया जा सकता है? नेटटी एक विकल्प है? नेटटी को मौजूदा जर्सी आधारित वेब सेवा में कैसे एकीकृत किया जा सकता है इस पर कोई संकेतक? क्या इसे पूरा करने में सहायता के लिए अन्य फ्रेम काम उपलब्ध हैं? मुझे वेब सेवा के लिए जावा का उपयोग करना है। कोई भी पॉइंटर्स सहायक होगा।जावा सर्वर से बड़ी फ़ाइल स्थानांतरण जावा जर्सी रेस्ट एपीआई

+0

शायद स्वीकार किए जाते हैं जवाब आप भी मदद कर सकते हैं: http://stackoverflow.com/questions/10326460/upload-a-large-file-using-jersey-client – Eich

+0

है यह sftp या ftps करने के लिए "आउटसोर्स" करने का विकल्प है? सर्वरसाइड को तब मानक एफटीपी-सर्वर-एप्लिकेशन द्वारा प्रबंधित किया जा सकता है। क्लाइंट साइड पर निश्चित रूप से उपयोग करने के लिए उपयोग घटक हैं। – Fildor

+0

चूंकि यह केवल डाउनलोड है: webservice को कुछ वेबसर्वर (उदाहरण के लिए अपाचे httpd) के लिए http: लिंक प्रदान करें जो केवल फ़ाइल परोसता है। यदि आप apache httpd के माध्यम से प्रॉक्सी करते हैं तो यह आपके लिए प्रमाणीकरण भी कर सकता है। –

उत्तर

6

यदि आप आउट-ऑफ-मेमोरी समस्याओं पर फंस रहे हैं, तो आपको यह जांचना चाहिए कि आप डाउनलोड करने वाले डेटा को कैसे प्रबंधित कर रहे हैं। यदि आप जर्सी के क्लाइंट रिस्पॉन्स का उपयोग कर रहे हैं, तो सुनिश्चित करें कि आप getEntityInputStream() का उपयोग कर रहे हैं और getEntity() नहीं प्राप्त कर रहे हैं। इस तरह, आप डेटा को स्ट्रीम कर सकते हैं, इसे फ़ाइल में लिख सकते हैं, और इसे जावा हीप स्पेस में बनाने की बजाय इसे अलग कर सकते हैं।

मैं वास्तव में आपकी एक साथ डाउनलोड चिंताओं के बारे में बात नहीं कर सकता, लेकिन यदि आप वेब सेवाओं के ढांचे का उपयोग कर रहे हैं, तो इसे ठीक से संभाला जाना चाहिए।

दोनों मुद्दों के लिए, आपके विशिष्ट कार्यान्वयन, विशेष रूप से कोड पर अधिक जानकारी, आपको बेहतर प्रतिक्रिया प्राप्त करने में मदद मिलेगी।

2

सर्वर और क्लाइंट दोनों को HTTP खंडित एन्कोडिंग का समर्थन करना चाहिए जो HTTP को HTTP का उपयोग करके डेटा स्ट्रीम करने की अनुमति देता है। नीचे दिया गया कोड जर्सी 2.11 के साथ काम करना चाहिए।

बड़ी फ़ाइलें डाउनलोड करने के लिए, सर्वर पर इस कोशिश:

@GET 
@Path("/files/{fileName}") 
@Produces(MediaType.APPLICATION_OCTET_STREAM) 

public StreamingOutput getFile(@PathParam("fileName") final String fileName) throws Exception { 
    //create instance of StreamingOutput here 
    return streamingOutput; 
} 

एक फ़ाइल डाउनलोड करने steams का उपयोग कर एक ग्राहक GET अनुरोध के लिए यह प्रयास।

public String getFileReq(File outFile) throws IOException { 

    client = ClientBuilder.newClient(new ClientConfig()); 
    client.property(ClientProperties.REQUEST_ENTITY_PROCESSING, "CHUNKED"); 
    WebTarget target = client.target(URI) 
    OutputStream fileOutputStream = new FileOutputStream(outFile); 
    InputStream fileInputStream = target.request().get(InputStream.class); 
    writeFile(fileInputStream, fileOutputStream);  

}

public static void writeFile(InputStream fileInputStream, OutputStream outputStream) throws IOException { 
try { 
    byte[] buffer = new byte[1024]; 
    int bytesRead; 

    while((bytesRead = fileInputStream.read(buffer)) !=-1) { 
     outputStream.write(buffer, 0, bytesRead); 
    } 

    fileInputStream.close(); 
    outputStream.flush(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} finally { 
    outputStream.close(); 
} 
संबंधित मुद्दे