我可以说我是整个编程世界的新手!
案例是我正在使用Retrofit2与JHipster集成Android项目。
好吧,我要做的是将图像保存到数据库(MySQL),保存在byte []字段中。
这就是我在后端用户实体上的内容:
@Entity
@Table(name = "usuario")
public class Usuario implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@NotNull
@Column(name = "name", nullable = false)
private String name;
@Lob
@Column(name = "image")
private byte[] image;
@Column(name = "image_content_type")
private String imageContentType;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public byte[] getImage() {
return image;
}
public void setImage(byte[] image) {
this.image = image;
}
public String getImageContentType() {
return imageContentType;
}
public void setImageContentType(String imageContentType) {
this.imageContentType = imageContentType;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Usuario usuario = (Usuario) o;
if(usuario.id == null || id == null) {
return false;
}
return Objects.equals(id, usuario.id);
}
@Override
public int hashCode() {
return Objects.hashCode(id);
}
@Override
public String toString() {
return "Usuario{" +
"id=" + id +
", name='" + name + "'" +
", image='" + image + "'" +
", imageContentType='" + imageContentType + "'" +
'}';
}
}
这就是我在Android Class上所拥有的:
public class Usuario {
Long id;
String name;
String image;
String imageContentType;
public Usuario() {
}
public Usuario(Long id, String name, String image) {
this.id = id;
this.name = name;
this.image = image;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getImageContentType() {
return imageContentType;
}
public void setImageContentType(String imageContentType) {
this.imageContentType = imageContentType;
}
我也尝试将图像保存在Android的Byte []中,但是因为当我试图获取用户信息时我无法得到响应(我收到的JSON文件似乎有问题)从后端开始,当Android想要一个字符串时,我收到一个数组),我必须使用一个字符串。所以我在REST资源上实现了一个方法,将该String转换为Byte [],如下所示:
@RequestMapping(value = "/usuarios/{img}/{id}",
method = RequestMethod.PUT,
produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
public ResponseEntity<Usuario> convertImage(@Valid @RequestBody Usuario usuario, @RequestBody String img, @RequestBody Long id) {
log.debug("REST request to get Usuario : {}", id, img);
usuario = usuarioRepository.findOne(id);
byte[] b = img.getBytes();
usuario.setImage(b);
Usuario result = usuarioRepository.save(usuario);
return ResponseEntity.ok()
.headers(HeaderUtil.createEntityUpdateAlert("usuario", usuario.getId().toString()))
.body(result);
}
我想我没有正确使用@RequestMapping,但不知何故从JHipster CRUD使用API方法工作正常,问题似乎是Android / Retrofit2方法,如下所示:
这就是服务:
@Multipart
@PUT("/api/usuarios/{id}/{img}")
Call<Usuario> convertImage(
@Header("Authorization") String Authorization,
@Part("img") String img, @Part("id") Long id
);
我在UserManager上的内容:
public synchronized void convertImage(final UsuarioCallback usuarioCallback, String img, Long id) {
Call <Usuario> call = usuarioService.convertImage(UserLoginManager.getInstance(context).getBearerToken(), img, id);
call.enqueue(new Callback<Usuario>() {
@Override
public void onResponse(Call<Usuario> call, Response<Usuario> response) {
int code = response.code();
if (code == 200 || code == 201) {
} else {
usuarioCallback.onFailure(new Throwable("ERROR" + code + ", " + response.raw().message()));
}
}
这就是我打电话和传递信息的方式:
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream);
byte[] byte_arr = stream.toByteArray();
String imgString = Base64.encodeToString(byte_arr,
Base64.DEFAULT);
Usuario usuario = new Usuario();
usuario.setId(Long.parseLong("1"));
Long id = usuario.getId();
UsuarioManager.getInstance(view.getContext()).convertImage(EditProfile.this, imgString, id);
有了这一切,我得到了标题中显示的错误,所以我真的不知道这有什么不妥。
我想这就是我应该提供的所有信息,对不起,如果我错过了一些东西,但是我有点迷失了这个错误而且我已经被困在这里好几个星期了。
事先谢谢你!
答案 0 :(得分:0)
我建议采用不同的方法,而不是将图像放在DB或JSON中。
数据库:旨在保存,搜索,排序许多小块数据,通常最好将引用(可能是UUID)放到文件系统上的二进制文件中。 Here是关于注意事项的好文章
JSON 这是格式化的文字。在文本中编码byte []数据然后编码为byte []以通过网络发送将增加大量开销。虽然大多数人(以及大多数JSON库)可能更适合与图像共享URL或直接为图像制作REST endpoint。