无法从request.getInputStream()获取getImage

时间:2013-03-08 18:23:48

标签: java android google-app-engine java-ee

我正在尝试从请求属性中获取来自移动应用程序的图像字节。

上游发送的图像格式是BitMap。 以Base64格式编码。

如何获取Web应用程序中的字节? 我在我的Web应用程序中使用以下代码片段,我用它从移动应用程序请求中获取数据。 我对代码很感兴趣。我不确定我是对还是错。

byte[] line             = null;

    int noOfBytesRead;
    StringBuffer content    = new StringBuffer();

    HashMap<String, Object> lResultMap  =   null ;

    try 
    {
        log.info("request getInputStream: " + request.getInputStream());
        ServletInputStream sis  = request.getInputStream();

        line                    = new byte[128];
        noOfBytesRead           = sis.readLine(line, 0, 128);
        log.info("noOfBytesRead :1 " + noOfBytesRead);

        if (noOfBytesRead < 3)
            return null;

        noOfBytesRead           = sis.readLine(line, 0, 128); // Reads the content disposition and form name and filename

        log.info("line :"+line+" adn the noOfBytesRead : 2 : "  +   noOfBytesRead);

        int numBytesToRead      = noOfBytesRead;
        int availableBytesToRead;

        while ((availableBytesToRead = sis.available()) > 0) 
        {
            byte[] bufferBytesRead;
            bufferBytesRead     = availableBytesToRead >= numBytesToRead ? new byte[numBytesToRead] : new byte[availableBytesToRead];
            sis.read(bufferBytesRead);
            content.append(new String(bufferBytesRead, Charset.forName("iso-8859-1")));
        }
        sis.close();
        log.info("The bytes is  : " +content.toString());
        byte[] image        =   null;
        image   =   content.toString().getBytes(Charset.forName("iso-8859-1")) ;
        log.info("image : "  +image);


        Base64Decoder decoder = new Base64Decoder();  
        byte[] imgBytes = decoder.decode(content.toString());
        log.info("imgBytes : decoded byted" + imgBytes);        
        lResultMap          =   new HashMap<String, Object>();

        lResultMap.put("content"    , imgBytes );
        log.info("content string buffer :  " +content);
        log.info("lResultMap : "  +lResultMap);
    } 
    catch (Exception e) 
    {
        e.printStackTrace();
        log.log(Level.SEVERE, e.getMessage(), e);
    }

1 个答案:

答案 0 :(得分:0)

很难理解你的代码,因为它没有格式化,但这是我的简单解决方案

URL url = new URL(contentUrl);
        URLConnection conn = url.openConnection();
        InputStream inStr = conn.getInputStream();
        BufferedInputStream buffInStr = new BufferedInputStream(inStr);
        // Need to check the size of Byte Array Buffer.
        ByteArrayBuffer baf = new ByteArrayBuffer(500);
        int current = 0;
        while ((current = buffInStr.read()) != -1) {
            baf.append((byte) current);
        }
        byte[] array = baf.toByteArray();

在谷歌应用引擎上

Image Service API接受任何支持的图像文件格式的数据。根据{{​​3}},这些格式包括“JPEG,PNG,WEBP,GIF(包括动画GIF),BMP,TIFF和ICO”。 Image服务不提供从头创建新图像数据的方法。但是您可以使用图形库以一种可接受的数据格式生成图像,然后使用该服务将其转换为另一种格式,或者对其进行转换。当然,根据图形库,您可以直接从库中获取最终图像,而不是使用该服务。

要提供图像,只需为您正在使用的数据格式设置适当的Content-Type标头,然后将图像数据的字节写入响应的输出流:

// byte[] pngData = ...
resp.addHeader("Content-Type", "image/png");
resp.getOutputStream().write(pngData);

如果您想尝试在没有库的情况下生成图像数据,BMP格式可能最简单。您可以使用Images服务将其转换为PNG。