0

我需要实现一个包含缩略图的列表视图,并且这个缩略图是使用 volley networkimageview 加载的。如果我的控制器如下所示,我将如何实现:

@RequestMapping (value="/rest/getphoto/",produces=MediaType.IMAGE_PNG_VALUE)
public @ResponseBody byte [] get Image (@RequestParam ("imageId"));

我发现了很多关于凌空使用的例子,但它们对我没有帮助。此外,我正在使用安全连接。提前致谢。

编辑:我在我的 spring mvc 项目中包含控制器代码,并在我的 android 客户端中请求图像的代码部分。

* 弹簧 MVC *

@RequestMapping(value = "/rest/singlephoto/", method = RequestMethod.GET, produces = MediaType.IMAGE_PNG_VALUE)
    public @ResponseBody byte[] base64ImageForAndroid(@RequestParam("photoId") String photoIdParam, HttpServletRequest request)
    {
        String pathToLoad = "/path/default.png";
        //HashMap<String, String> retVal = new HashMap<String, String>();
        byte[] retVal;

        try
        {
            long photoId = Long.parseLong(photoIdParam);
            Photo photo = photoManager.getSinglePhoto(photoId);

            if (photo != null)
                pathToLoad = photo.getPath();
        }
        catch (NumberFormatException ex)
        {
        }
        finally
        {
            try
            {
                File file = new File(pathToLoad);
                retVal = FileUtils.readFileToByteArray(file);
            }
            catch (IOException ex)
            {
                retVal = null;
            }
        }

        return retVal;

* Android 客户端通过凌空请求 *

Bitmap thumb = imageCache.get(item.getThumbnailUrl() + "thumb");
        if (thumb == null)
        {
            HttpHeaders headers = new HttpHeaders();
            HttpBasicAuthentication auth = new HttpBasicAuthentication(this.username, this.password);
            headers.setAuthorization(auth);
            headers.setAccept(Collections.singletonList(MediaType.APPLICATION_OCTET_STREAM));

            Listener<byte[]> imageLoadedListener = new Response.Listener<byte[]>() {

                @Override
                public void onResponse(byte[] photoByteArray) {
                    Bitmap bitmap = EfficientImageLoading.decodeBitmapFromByteArray(photoByteArray, viewHolder.thumbnail.getWidth(), viewHolder.thumbnail.getHeight());

                    viewHolder.thumbnail.setImageBitmap(bitmap);
                    imageCache.put(item.getThumbnailUrl() + "thumb", bitmap);

                    //Cache full size and recycle
                    Bitmap fullBmp = EfficientImageLoading.decodeImageFromByteFullSize(photoByteArray);
                    imageCache.put(item.getThumbnailUrl(), fullBmp);
                }
            };

            ErrorListener errorListener = new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    viewHolder.thumbnail.setImageResource(R.drawable.ic_launcher);
                }
            };

            this.singleInstance.addToRequestQueue(new CustomImageRequest(Request.Method.GET, item.getThumbnailUrl(), errorListener, headers, imageLoadedListener));
}

应用服务器日志显示:

GET /app//photo/rest/singlephoto/?photoId=7 HTTP/1.1" 406 1067

那是406——禁止或类似的东西。android 的 LogCat 也显示如下错误: BasicNetwork.PerformRequest: Unexpected response code 406 for https://domain/app/singlephoto?photoId=7

我的控制器或我的客户端或两者都有问题吗?

4

0 回答 0