无法从服务器检索压缩的位图

时间:2014-11-20 13:57:10

标签: android bitmap compression spring-boot retrofit

所以我试图通过rest服务器存储压缩位图的byte []数组。我首先从imageView中检索源文件并将其转换为Bitmap然后将其转换为字节数组,之后我将原始字节发送到服务器并保存:

PhotoSvcApi photoService= RestServer.getInstance();
...
                            Bitmap bitmap = ((BitmapDrawable)img.getDrawable()).getBitmap();
                            ByteArrayOutputStream baos = new ByteArrayOutputStream();
                            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
                            byte[] imageBytes = baos.toByteArray();

                            Long newId = photoService.addPhotoData(imageBytes);

在服务器端,我使用springframe工作来映射处理程序以保存和检索数据到服务器。根据我的日志和测试,我能够成功地保存和检索客户端的数据。这是从服务器检索数据到android客户端的方法。

@RequestMapping(value = PhotoSvcApi.IMAGE_DATA_PATH, method = RequestMethod.GET)
    public @ResponseBody
    void getData(@PathVariable(value = PhotoSvcApi.ID_PARAMETER) Long id,
            HttpServletResponse response) {

        byte[] source = imageData.get(id);

        try {
            response.getOutputStream().write(source);
        } catch ( IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

如您所见,我将字节放在响应主体中的OutputStream中。接下来,我认为错误发生的地方因为我无法成功重新创建压缩位图。我正在使用改造来访问服务器。

public void getDataFromServer(long id){

        CallableTask.invoke(new Callable<Bitmap>() {

            @Override
            public Bitmap call() throws Exception {
                // TODO Auto-generated method stub

                Intent intent = getActivity().getIntent();
                long giftId = intent.getLongExtra(ID_KEY, -1);
                Log.e("detail", String.valueOf(giftId));





                PhotoSvcApi photoService= RestServer.getInstance();
                Response response = photoService.getData(giftId); // retrofit streaming



                Bitmap bitmap =  BitmapFactory.decodeStream(response.getBody().in());
                if(bitmap == null){
                    Log.e("detail", "bitmap is in fact null - fix it");
                }

我真的不认为它与服务器有关,因为我的@post REST方法发送的@get方法在其正文中返回的数据量完全相同

11-19 23:47:58.933: D/Retrofit(3405): ---> HTTP POST http://10.0.2.2:8080/giftdata
11-19 23:47:59.611: D/Retrofit(3405): ---> END HTTP (1701907-byte body)
11-19 23:48:07.081: D/Retrofit(3405): <--- HTTP 200 http://10.0.2.2:8080/giftdata (7474ms)
11-19 23:48:07.081: D/Retrofit(3405): : HTTP/1.1 200 OK
11-19 23:48:07.101: D/Retrofit(3405): <--- END HTTP (1-byte body)
...
11-19 23:48:54.324: D/Retrofit(3405): ---> HTTP GET http://10.0.2.2:8080/giftdata/4/data

11-19 23:48:54.332: D/Retrofit(3405): ---> END HTTP (no body)
11-19 23:48:54.372: D/Retrofit(3405): <--- HTTP 200 http://10.0.2.2:8080/giftdata/4/data (39ms)
11-19 23:48:54.372: D/Retrofit(3405): : HTTP/1.1 200 OK
11-19 23:48:57.671: D/Retrofit(3405): <--- END HTTP (1701907-byte body)

1 个答案:

答案 0 :(得分:0)

你有一个关于void方法的@ResponseBody,这实际上没有任何意义,但是Spring可能会对它进行字面处理而不发送任何内容。您根本不必将字节写入响应,只需从方法中返回它们。