2010-12-17 17 views
9

काम नहीं कर रहा है मैं एक एंड्रॉइड प्रोग्राम विकसित कर रहा हूं जो जावा में एक ऐप इंजन प्रोग्राम के साथ POST के माध्यम से डेटा साझा करता है। जब मैं मल्टीपार्ट एंटीटी का उपयोग करके पोस्ट करता हूं तो एपेंगिन प्रोग्राम किसी भी कारण के लिए मेरे किसी भी पोस्ट चर को देखने में असमर्थ है जिसे मैं समझ नहीं सकता!Google App Engine पर एंड्रॉइड मल्टीपार्ट पोस्ट

AppEngine कोड:

public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { 
    resp.setContentType("text/plain"); 
    resp.getWriter().println("Output:"); 

    String mRoutine = req.getParameter("Routine"); 
    resp.getWriter().println("Routine: " + mRoutine); 

    String mPMode = req.getParameter("PMode"); 
    resp.getWriter().println("PMode: " + mPMode); 
} 

कार्य एंड्रॉयड स्निपेट:

HttpPost post = new HttpPost("http://XXX.appspot.com/Echo"); 
HttpClient client = new DefaultHttpClient(); 
post.setEntity(new UrlEncodedFormEntity(data,HTTP.UTF_8)); 
HttpResponse response = client.execute(post); 
HttpEntity resmarkMessagesReadFrom = response.getEntity(); 
if (resmarkMessagesReadFrom != null) { 
    Result_STR= "Response:\n" + EntityUtils.toString(resmarkMessagesReadFrom); 
    mMSGBox.setText(Result_STR); 
} 

असफल एंड्रॉयड स्निपेट:

HttpPost post = new HttpPost("http://XXX.appspot.com/Echo"); 
HttpClient client = new DefaultHttpClient(); 
MultipartEntity reqmarkMessagesReadFrom = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
try { 
    reqmarkMessagesReadFrom.addPart("Routine", new StringBody("Neutral")); 
    post.setEntity(reqmarkMessagesReadFrom); 
    HttpResponse response = client.execute(post); 
    HttpEntity resmarkMessagesReadFrom = response.getEntity(); 
    if (resmarkMessagesReadFrom != null) { 
     Result_STR= "Response:\n" + EntityUtils.toString(resmarkMessagesReadFrom); 
     mMSGBox.setText(Result_STR); 
    } 

उत्तर

3

क्लाइंट पर MultipartEntity कक्षा का उपयोग करके, आपको doPost को एक अलग तरीके से सर्वर पक्ष में संभालना होगा, Apache Commons FileUpload जैसे एपीआई के साथ फाइल/पैरामीटर पढ़ना होगा।

Google ऐप इंजन फाइल सिस्टम पर लिखने की अनुमति नहीं देता है, इसलिए आपको स्ट्रीमिंग API का उपयोग करने की आवश्यकता है।

import org.apache.commons.fileupload.FileItemStream; 
import org.apache.commons.fileupload.FileItemIterator; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 
import java.io.InputStream; 
.. 
public void doPost(HttpServletRequest req, HttpServletResponse res) 
     throws ServletException, IOException { 
    try { 
     ServletFileUpload upload = new ServletFileUpload(); 
     res.setContentType("text/plain"); 

     FileItemIterator iterator = upload.getItemIterator(req); 
     while (iterator.hasNext()) { 
     String name = item.getFieldName(); 
     FileItemStream item = iterator.next(); 
     InputStream stream = item.openStream(); 

     if (item.isFormField()) { 
      resp.getWriter().println((name + " : " + Streams.asString(stream)); 
     } 
     } 
    } catch (Exception ex) { 
     throw new ServletException(ex); 
    } 
} 
+0

systempuntoout: आपकी प्रतिक्रिया के लिए धन्यवाद। मैं FileUpload को ठीक से काम करने में असमर्थ रहा हूं इसलिए मैं आपके कोड का उपयोग करने में सक्षम नहीं हूं। हालांकि, मेरे उदाहरण AppEngine कोड को सरल HTML फ़ॉर्म का उपयोग करके बस ठीक से बाइनरी अपलोड प्राप्त हुए। मुझे अभी भी लगता है कि कैसे एंड्रॉइड और ऐपइंजिन संचार कर रहे हैं और मुझे अभी तक कोई काम नहीं मिला है ... – Robert

+0

@Robert क्या आपने मेरी स्निपेट की कोशिश की है? – systempuntoout

+0

नहीं, मैं काम करने के लिए FileUpload प्राप्त करने में सक्षम नहीं हूं। मैं यह भी चिंतित हूं कि संकलक मुझे चेतावनी दे रहा है कि अनुप्रयोग लोड होने पर फ़ाइलउप्लोड सर्वर पर उपलब्ध नहीं होगा ... – Robert

1

सर्वश्रेष्ठ उत्तर मैं पाया है गूगल के स्वयं के उदाहरणों में से एक है: http://code.google.com/intl/fr/appengine/kb/java.html#fileforms इस FileUpload का उपयोग करता है बस systempuntoout के उदाहरण की तरह।

import org.apache.commons.fileupload.FileItemStream; 
import org.apache.commons.fileupload.FileItemIterator; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 
import java.io.InputStream; 
import java.io.IOException; 
import java.util.logging.Logger; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class FileUpload extends HttpServlet { 
    private static final Logger log = 
     Logger.getLogger(FileUpload.class.getName()); 

    public void doPost(HttpServletRequest req, HttpServletResponse res) 
     throws ServletException, IOException { 
    try { 
     ServletFileUpload upload = new ServletFileUpload(); 
     res.setContentType("text/plain"); 

     FileItemIterator iterator = upload.getItemIterator(req); 
     while (iterator.hasNext()) { 
     FileItemStream item = iterator.next(); 
     InputStream stream = item.openStream(); 

     if (item.isFormField()) { 
      log.warning("Got a form field: " + item.getFieldName()); 
     } else { 
      log.warning("Got an uploaded file: " + item.getFieldName() + ", name = " + item.getName()); 

      // You now have the filename (item.getName() and the 
      // contents (which you can read from stream). Here we just 
      // print them back out to the servlet output stream, but you 
      // will probably want to do something more interesting (for 
      // example, wrap them in a Blob and commit them to the 
      // datastore). 
      int len; 
      byte[] buffer = new byte[8192]; 
      while ((len = stream.read(buffer, 0, buffer.length)) != -1) { 
      res.getOutputStream().write(buffer, 0, len); 
      } 
     } 
     } 
    } catch (Exception ex) { 
     throw new ServletException(ex); 
    } 
    } 
}