2009-07-10 17 views
44

में मूल फ़ाइल अपलोड करें मैं GWTs FileUpload विजेट का उपयोग करके एक फ़ाइल को अपलोड करने का तरीका जानने का प्रयास कर रहा हूं। मैं जावा के साथ जीडब्ल्यूटी और Google AppEngine का उपयोग कर रहा हूं लेकिन मैं अपने स्वयं के लिनक्स सर्वर पर फ़ाइल अपलोड करना चाहता हूं। मैं आगे क्या करना है की क्या ज़रूरत है अबजीडब्ल्यूटी

public class FileUploader{ 

    private ControlPanel cp; 
    private FormPanel form = new FormPanel(); 
    private FileUpload fu = new FileUpload(); 

    public FileUploader(ControlPanel cp) { 
     this.cp = cp; 
     this.cp.setPrimaryArea(getFileUploaderWidget()); 
    } 

    @SuppressWarnings("deprecation") 
    public Widget getFileUploaderWidget() { 
     form.setEncoding(FormPanel.ENCODING_MULTIPART); 
     form.setMethod(FormPanel.METHOD_POST); 
     // form.setAction(/* WHAT SHOULD I PUT HERE */); 

     VerticalPanel holder = new VerticalPanel(); 

     fu.setName("upload"); 
     holder.add(fu); 
     holder.add(new Button("Submit", new ClickHandler() { 
      public void onClick(ClickEvent event) { 
       GWT.log("You selected: " + fu.getFilename(), null); 
       form.submit(); 
      } 
     })); 

     form.addSubmitHandler(new FormPanel.SubmitHandler() { 
      public void onSubmit(SubmitEvent event) { 
       if (!"".equalsIgnoreCase(fu.getFilename())) { 
        GWT.log("UPLOADING FILE????", null); 
             // NOW WHAT???? 
       } 
       else{ 
        event.cancel(); // cancel the event 
       } 

      } 
     }); 

     form.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() { 
      public void onSubmitComplete(SubmitCompleteEvent event) { 
       Window.alert(event.getResults()); 
      } 
     }); 

     form.add(holder); 

     return form; 
    } 
} 

,: मैं निम्नलिखित कोड पहले से ही है लेकिन अब मैं समझ नहीं कैसे गूगल AppServer सर्वर से मेरी फाइल प्रस्तुत करने के लिए है और यह अन्य सर्वर पर बचाने के? क्या मैं web.xml में डाल करने की आवश्यकता है और कैसे मैं अपने सर्वलेट लिखने तो मैं फ़ाइल की दुकान और उस वस्तु की वापसी यूआरएल (यदि संभव हो)

उत्तर

57

यहाँ मेरी app से कोड है कर सकते हैं:

1) मैं एक वर्ग बनाया http अनुरोध स्वीकार करने के लिए:

import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.apache.commons.fileupload.FileItemIterator; 
import org.apache.commons.fileupload.FileItemStream; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 

public class FileUpload extends HttpServlet{ 
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     ServletFileUpload upload = new ServletFileUpload(); 

     try{ 
      FileItemIterator iter = upload.getItemIterator(request); 

      while (iter.hasNext()) { 
       FileItemStream item = iter.next(); 

       String name = item.getFieldName(); 
       InputStream stream = item.openStream(); 


       // Process the input stream 
       ByteArrayOutputStream out = new ByteArrayOutputStream(); 
       int len; 
       byte[] buffer = new byte[8192]; 
       while ((len = stream.read(buffer, 0, buffer.length)) != -1) { 
        out.write(buffer, 0, len); 
       } 

       int maxFileSize = 10*(1024*1024); //10 megs max 
       if (out.size() > maxFileSize) { 
        throw new RuntimeException("File is > than " + maxFileSize); 
       } 
      } 
     } 
     catch(Exception e){ 
      throw new RuntimeException(e); 
     } 

    } 
} 

2) तब मेरे web.xml में मैं जोड़ दिया है इन पंक्तियों:

<servlet> 
    <servlet-name>fileUploaderServlet</servlet-name> 
    <servlet-class>com.testapp.server.FileUpload</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>fileUploaderServlet</servlet-name> 
    <url-pattern>/testapp/fileupload</url-pattern> 
</servlet-mapping> 

3) और form.action के लिए ऐसा किया:

form.setAction(GWT.getModuleBaseURL()+"fileupload"); 
+1

मैं है ओ पी के रूप में सटीक कर सकते हैं के साथ जाने के फ़ाइल अपने स्वयं के लिनक्स वेब सर्वर पर। ओपी ने आपके उत्तर को सबसे अच्छे उत्तर के रूप में चुना है, इसलिए मुझे लगता है कि उसने उसे अपने प्रश्न के साथ मदद की है, लेकिन मुझे नहीं पता कि फ़ाइलउप्लोड श्रेणी कहां रखना है, क्या यह अन्य परियोजना फाइलों के साथ जीएई में है? लिनक्स सर्वर के बारे में क्या? फाइलें कैसे प्राप्त होंगी? और पता निर्दिष्ट कहाँ है? और फ़ाइल का नाम? मैं कोड के इस टुकड़े से उलझन में हूँ। –

+3

10 एमआईबी नहीं है "10 * 1024 * 1024" नहीं "10 * (1024 * 2)", या "megs" 2 KiB के लिए एक वैकल्पिक नाम है? –

+2

10 * (1024 * 2) 20 केबी है, लेकिन 10 एमबी – Antonio

5

GWT में, आप फ़ाइल सर्वर से http प्रपत्र तरीकों का उपयोग कर पोस्ट कर सकते हैं, और आप की आपूर्ति का उपयोग करना चाहिए HttpServlet स्वीकार करते हैं और AppEngine बिगटेबल में द्विआधारी ब्लॉग के रूप में डेटा को बचाने के लिए।

फिर, आपको बड़े टेक्स्ट से फ़ाइल को पढ़ने के लिए एक दूसरी HttpServlet की आवश्यकता है, HTTP हेडर {और कैशिंग विकल्प} में माइम प्रकार सेट करें, और उसके बाद फ़ाइल को उपयोगकर्ता को स्ट्रीम करें।

हालांकि RPC को अनिवार्य रूप से आवश्यक नहीं है, आपको क्लाइंट को यह जानना चाहिए कि जेनरेट की गई फ़ाइल आईडी क्या है ताकि वे इसे एक्सेस कर सकें {जब तक कि आप उपयोगकर्ता को आईडी की आपूर्ति नहीं करना चाहते हैं और उन्हें नाम ओवरराइड के बारे में चिंता करने के लिए मजबूर करना चाहते हैं ...। ..ick}। या तो आप आरपीसी का उपयोग/एकल आईडी {जैसे "उपयोगकर्ता द्वारा नवीनतम फ़ाइल आईडी"} के लिए पूछने के लिए कर सकते हैं, या आप उस आईडी को अपलोडस्वर्लेट की प्रतिक्रिया के शरीर में वापस कर सकते हैं ... लेकिन फिर आपको यह सुनिश्चित करना होगा कि आपका पोस्ट लक्ष्य एक इन-पेज आईफ्रेम है, यह सुनिश्चित करने के लिए मतदान करें कि iframe सबमिट ईवेंट और वास्तविक सर्वर प्रतिक्रिया के बीच एक बॉडी है, और फिर उस आईडी का उपयोग करें और फ़ाइल का उपयोग करने वाले आईएमजी या ऑब्जेक्ट टैग बनाने के लिए उस आईडी का उपयोग करें।

मुख्य भाग में अपलोड के लिए एक सर्वलेट है, और दूसरा डाउनलोड करने के लिए है। याद रखें, बिगटेबल सिर्फ बाइनरी ब्लॉब्स स्टोर करता है, इसलिए आपको अपनी डेटा इकाई को माइम/सामग्री रखने के लिए भी आवश्यकता होती है जिसे इनपुट फ़ाइल से पढ़ा जा सकता है {फ़ाइल एक्सटेंशन पर भरोसा न करें!}। साथ ही, बिगटेबल में प्रति इकाई 1 एमबी है, और मुफ्त खातों के लिए 10 एमबी अनुरोध सीमा है। आप अपनी डेटा इकाई में 1-10 ब्लॉब्स की एक सूची रखना चाहते हैं, जिनमें से प्रत्येक अधिकतम 1024bytes हैं।

असल में, आपकी सबसे अच्छी शर्त एक फ़ाइल, Google की तरह सेवा, मुफ्त प्रतिलिपि ढूंढना है, और यह सीखने के लिए कि सिस्टम कैसे काम करता है, इसे विस्तारित करना है।

यदि आप चाहें, तो मैं gwt control widgets को समाप्त करने के बाद, फ़ाइल हैंडलिंग का अपना ओपन-सोर्स संस्करण पोस्ट कर दूंगा और इसे सभी के लिए उपयोगी होने के लिए पर्याप्त स्थिर मान सकता हूं। ईमेल x AT aiyx डीओटी जानकारी यदि आप चाहते हैं कि मैं आपको betalicious कोड का एक जार भेजूं।

11

मैं GWTUpload का उपयोग करने का सुझाव दूंगा क्योंकि यह उपयोग करने और विस्तार करने के लिए आसान है। आप इसे 10 मिनट से भी कम समय में अपनी परियोजना में जोड़ सकते हैं और यह बॉक्स के बाहर जीएई का समर्थन करता है (GWTUpload-GAE का उपयोग करके)। कुछ सामान्य उपयोग परिदृश्यों के लिए examples देखें।

+2

नोट: GWTUpload सत्रों की आवश्यकता है –

+1

GWTUpload का उपयोग करने के पेशेवर/विपक्ष क्या हैं @KevMo – kroiz

+2

द्वारा प्रदान किया गया समाधान GWTUpload स्थिति अपडेट, बहु-फ़ाइल अपलोड और बहुत कुछ के साथ एसिंक्रोनस अपलोड की अनुमति देता है। यह सामान्य फ्लैश विकल्पों के लिए एक पूर्ण प्रतिस्थापन प्रतीत होता है। – rluba

2

जब तक आप पहले से ही अन्य ढांचे का उपयोग नहीं कर रहे हैं, तो मैं दृढ़ता से सादे वेनिला जीडब्ल्यूटी और इसके मूल घटकों का उपयोग करने का सुझाव देता हूं। यदि आप अन्य ढांचे का उपयोग करते हैं, तो आप अपने आवेदन के आकार को बहुत विस्फोट कर सकते हैं।

देशी घटकों का उपयोग करते हुए 3 चरणों में किया जा सकता है:

  1. एक फाइल अपलोड सर्वलेट
  2. संशोधित web.xml
  3. बनाएँ GWT अपलोड फ़ॉर्म

दिलचस्प बात यह है, जीडब्ल्यूटी भाग सबसे आसान है। यदि आप चाहें तो GWT Upload in 3 easy steps पर आप अपना कोड कॉपी कर सकते हैं। मुबारक अपलोडिंग! परियोजना GAE पर होस्ट की है और मैं चाहता हूँ अपलोड करने के लिए:

+0

मूल रूप से मुझे वास्तव में http://stackoverflow.com/a/1111606/787660 पर अंतर नहीं दिखता है, इस प्रकार डाउनवोट क्योंकि मुझे लगता है कि उत्तर अधिकतर समान है लेकिन दूसरा कोई और लिंक नहीं कर रहा है ... – Chris