所以我试图通过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)
答案 0 :(得分:0)
你有一个关于void方法的@ResponseBody
,这实际上没有任何意义,但是Spring可能会对它进行字面处理而不发送任何内容。您根本不必将字节写入响应,只需从方法中返回它们。