0 Replies Latest reply on Mar 19, 2012 7:17 AM by the_earnest

    How to get text/xml as UTF-8 from a multipart/form-data request with RESTeasy?

    the_earnest

      Hi,

       

      I want to upload utf-8 encoded xml files using the html form below and read it on the server using a RESTEasy MultipartFormDataInput and the java code below. The content of the uploaded file is already ASCII encoded independend of the encoding of the uploaded file, if I access it the way described below. All characters not part of ASCII are already replaced by ?. How can I get text/xml as UTF-8 from a multipart/form-data request with RESTeasy?

       

       

      <html>

      <body>

          <h1>JAX-RS Upload Form</h1>

          <form action="http://.../upload" method="POST" enctype="multipart/form-data">

             <p>Select a file : <input type="file" name="upload"/></p>

             <input type="submit" value="Upload It" />

          </form>

      </body>

      </html>

       

      ...

       

      @Path("/upload")

      @POST

      @Consumes("multipart/form-data")

      public Response createUploadTemplate(

              @Context HttpServletRequest req,

              MultipartFormDataInput formInput) {

          try {

              final String templateXml = getInput("upload", formInput);

              ...

          } catch (Exception e) {

              ...

          }

      }

       

      private static String getInput(final String searchedInput, final MultipartFormDataInput fileUploadInput) throws BadRequestException, IOException {

          try {

              final Map<String, List<InputPart>> inputToInputPart = fileUploadInput.getFormDataMap();

                  if(inputToInputPart.containsKey(searchedInput)) {

              final StringBuilder builder = new StringBuilder();

                      final List<InputPart> inputParts = inputToInputPart.get(searchedInput);

                      for(InputPart inputPart : inputParts) {

                          builder.append(inputPart.getBody(String.class,null));

                      }

                      return builder.toString();          

                  } else {

                      throw new BadRequestException("The form send with the request does not contain an input element " + searchedInput + ".");

                  }

          } catch(Exception e) {

              throw new BadRequestException("The file upload failed.", e);

          }

      }

       

      ...

       

      @Provider

      @Consumes ("text/xml")

      public class XmlStringReader implements MessageBodyReader<String> {

       

          private static Logger log = LoggerFactory.getLogger(UploadedXmlStringReader.class);

       

          private static final String ASCII = "ASCII";

          private static final String ISO8859_1 = "ISO8859_1";

          private static final String UTF8 = "UTF8";

       

          @Override

          public boolean isReadable(final Class<?> type,

                                      final Type genericType,

                                      final Annotation[] annotations,

                                      final MediaType mediaType) {

              boolean result = type.equals(String.class) && MediaType.TEXT_XML_TYPE.equals(mediaType);

              log.info(MessageFormat.format("{0} == String.class && MediaType.TEXT_XML_TYPE == {1}: {2}", type, mediaType, result));

              return result;

          }

       

          @Override

          public String readFrom(final Class<String> type,

                                              final Type genericType,

                                              final Annotation[] annotations,

                                              final MediaType mediaType,

                                              final MultivaluedMap<String, String> httpHeaders,

                                              final InputStream entityStream) throws IOException, WebApplicationException {

              final byte[] inBytes = new byte[1024];

              final ByteArrayOutputStream outBytes = new ByteArrayOutputStream(inBytes.length);

              int length = 0;

              while((length = entityStream.read(inBytes)) >= 0) {

                  outBytes.write(inBytes, 0, length);

              }

              final byte[] rawInput = outBytes.toByteArray();

       

              final String ascii = new String(rawInput, ASCII);

                  final String utf8 = new String(rawInput, UTF8);

                  final String isoLatin1 = new String(rawInput, ISO8859_1);       

              log.info("ASCII: " + ascii);

              log.info("UTF8: " + utf8);

              log.info("ISOLATIN1: " + isoLatin1);

              return utf8;

          }

      }