I don't have a good test case on-hand to reproduce this with, unfortunately. Are you seeing any exceptions in your logs? I ask because I usually pass the string "UTF-8" into InputStreamReader whereas you're passing in "utf8" -- it's possible (probable?) that both are supported, but the documentation does say an UnsupportedEncodingException will be thrown so best to be sure.
I usually use Spring which has a special filter already set up for automatically setting the character encoding properly. According to the documentation for this filter, it just calls the ServletRequest method's setCharacterEncoding method. I notice below that you're calling the same method for your ServletResponse but not on the requests -- can you set up your own filter to do this and see if that's the issue? - Jason On Fri, Sep 4, 2009 at 6:07 AM, sandlex <[email protected]> wrote: > > Hello. > > > I'm trying to do following: > 1. I have a GWT-application with a form uploading text files in utf8 > character encoding > 2. Uploaded file content I save in the entity Blob field in datastore > 3. I have a JavaFX client application getting this file content and > displaying it > > Everything works just fine on dev environment but on production I have > problems with encoding - I get question marks on my javafx appet form. > > More details. > > 1. On Form submit we go to > > public class Upload extends HttpServlet > > which creates a jdo transfer object (dictionaryTO) with byte[] field > where we need to store a content of the file: > dictionaryTO.setFile(inputStreamToBytes(item.openStream())); > > where (notice, I'm setting "utf8" there): > > private byte[] inputStreamToBytes(InputStream stream) > throws IOException, IllegalArgumentException, > IllegalStateException > { > > BufferedReader inputStream = null; > inputStream = new BufferedReader(new InputStreamReader > (stream, > "utf8")); > > String str; > ByteArrayOutputStream out = new ByteArrayOutputStream > (); > StringBuffer buffer = new StringBuffer(); > while ((str = inputStream.readLine()) != null) { > .... > buffer.append(str); > buffer.append("\n"); > } > out.write(buffer.toString().getBytes()); > out.close(); > return out.toByteArray(); > } > > 2. After that I need to transfer this object to next servlet > (dictionaryService) which will save this object as an entity in > datastore. Doing it this way: > PrintWriter out = null; > response.setCharacterEncoding("utf8"); > response.setContentType("text/plain"); > out = response.getWriter(); > ... > request.getSession().setAttribute("dictionary", > dictionaryTO); > response.sendRedirect("dictionaryService"); > > 3. dictionaryService is: > public class DictionaryServiceImpl extends RemoteServiceServlet > implements DictionaryService > > which gets a transfer object from session, converts it in jdo entity > object - dictionary. A field with file content is being converted from > byte[] into Blob in this way - new Blob(dictionaryTO).getFile()). And > then the object is saved in a standard way: pm.makePersistent > (dictionary). > > 4. After that we need to process a request from client javafx > application. All I need is two methods: > > import java.net.HttpURLConnection; > import java.net.URL; > > /** > * Common method that performs http request to the servlet in > order to > * retrieve required data > * > * @param urlString servlet name to send request > * @param xml xml-body of request > * @return xml-response from servlet > * @throws java.lang.Exception > */ > static private String performHttpPostRequest(String urlString, > String xml) throws Exception { > URL url; > HttpURLConnection connection; > String response = "false"; > url = new URL(urlString); > connection = (HttpURLConnection) url.openConnection(); > connection.setRequestMethod("POST"); > connection.setUseCaches(false); > connection.setDoOutput(true); > connection.setDoInput(true); > connection.setAllowUserInteraction(true); > connection.setRequestProperty("Content-Type", "application/x- > www-form-urlencoded;charset=utf8"); > //connection.setRequestProperty("Content-Type", "text/ > xml;charset=utf8"); > connection.setRequestProperty("Accept-Charset", "utf8"); > connection.getOutputStream().write(xml.getBytes()); > > InputStream inpStr; > inpStr = connection.getInputStream(); > //System.out.println("+++ " + connection.getRequestProperty > ("Content-Type")); > > response = convertStreamToString(inpStr); > > inpStr.close(); > > return response; > } > > /** > * Converts input stream received from servlet into string. > * > * @param is input stream > * @return input stream as a string > */ > static private String convertStreamToString(InputStream is) / > *throws UnsupportedEncodingException*/ { > > BufferedReader reader = new BufferedReader(new > InputStreamReader(is)); > StringBuilder sb = new StringBuilder(); > String line = null; > try { > while ((line = reader.readLine()) != null) { > sb.append(line); > } > } catch (IOException e) { > e.printStackTrace(); > } finally { > try { > is.close(); > } catch (IOException e) { > e.printStackTrace(); > } > } > > return sb.toString(); > } > > 5. On the server side this request receives > public class GetDictionary extends HttpServlet > > protected void doPost(HttpServletRequest request, > HttpServletResponse > response) throws ServletException, IOException { > response.setCharacterEncoding("utf8"); > response.setContentType("text/plain"); > ... > Here I'm parse an xml-string containing an ID of dictionary to > retreive from datastore (and whose file content I need to send back to > client). dictId is String. > ... > request.getSession().setAttribute > ("dictionaryToGetDictionary", > dictId); > response.sendRedirect(response.encodeURL > ("dictionaryService")); > } > > 6. After that dictionaryService (public class DictionaryServiceImpl > extends RemoteServiceServlet implements DictionaryService) will get an > entity object from datastore: > > public DictionaryTransferObject get(Long id) { > > PersistenceManager pm = PersistenceManagerHelper > .getPersistenceManager(); > > Query query = pm.newQuery(Dictionary.class); > query.setFilter("id == idParam"); > query.declareParameters("Long idParam"); > .... > } > > will parse field with file content using ENCODING="utf8" > > public static List<WordBean> getLines(DictionaryTransferObject > dictionary) { > > List<WordBean> wordsList = new ArrayList<WordBean>(); > > BufferedReader inputStream = null; > try { > inputStream = new BufferedReader(new > InputStreamReader( > new ByteArrayInputStream > (dictionary.getFile()), ENCODING)); > > String str; > while ((str = inputStream.readLine()) != null) > { > ... > > and will form an xml-string like xmlString="<lines><s>line</ > s><s>line</ > s>...</lines>" and will send it to client: > > protected void doGet(HttpServletRequest request, > HttpServletResponse response) throws > ServletException, IOException > { > response.setCharacterEncoding("utf8"); > PrintWriter out = response.getWriter(); > ... > response.setContentType("text/ > xml;charset=utf8"); > out.print(xmlString); > out.close(); > > return; > } > > On development environment everything works correctly on all stages, > but on production there are some problems and I cannot understand what > are the differences and where is a bug: > 1. when I write a file content to datastore? > 2. when I fetch it and send to client? > 3. or when I receive it on the cient-side? > > > Any ideas? > > > Thank you, > Alexey > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Google App Engine for Java" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en -~----------~----~----~----~------~----~------~--~---
