Java 无法使用改装将阵列发布到服务器中
我试图用数组发布多个图像,但无法将其发送到服务器,因为它显示了一些错误 当我试图发送转换成位图的图像时,它会进入Java 无法使用改装将阵列发布到服务器中,java,android,retrofit,Java,Android,Retrofit,我试图用数组发布多个图像,但无法将其发送到服务器,因为它显示了一些错误 当我试图发送转换成位图的图像时,它会进入onFailure方法并显示如下错误 错误返回位图 D/Onfail: /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEB
onFailure
方法并显示如下错误
错误返回位图
D/Onfail: /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB
AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEB
AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCACKAIoDASIA
AhEBAxEB/8QAHgABAAIDAQADAQAAAAAAAAAAAAUIBgcJAwECBAr/xABSEAABAgIFAhEGCAsJAAAA
AAAEAAUDBgECBxQVESEIExgkJTE1QVFVV2FxlJXR1BYjNER1oRIXM0VUgZGWNzhDWGRlsbbF1fAm
NlNWpbXB4fH/xAAYAQEBAQEBAAAAAAAAAAAAAAAAAgQDBf/EACIRAQAABAYDAQAAAAAAAAAAAAAB
AxPhAkFhcpHBESGhcf/aAAwDAQACEQMRAD8A/toREWh44iIgIiICIiAiIgIiICIiAiIgIiICIiAi
IgIiwmd5/lGztqqPc4vENqDrxLqL5oqOcYR9FEFC2QN78ufaQZsirJqtrDePXX7uOng01W1hvHrr
93HTwaOdPX5dZtFWTVbWG8euv3cdPBpqtrDePXX7uOng0Kevy6zaKsmq2sN49dfu46eDWxbP7ZbO
bSiDA5Sfr4eHC02K3mClAHXf6UIIbnO3tvLv50dG1kREBERAREQEREBERAVDdE2KM620WDsjlBvj
U4OjOAe3kZdIjDmTQGGXm4HEHhp+tXyVEtEX+HvQ+e3ZW/fIVEyst0OmSWrEaGayUgMB+s0Y3J3c
BaSoTUzsDWRHgj0etF37DW8Kn3cFKyWy9j0N9qzQS6yxZ9LdSI3xbo6N7gwCwDhCM90vfDno28/7
VonRYWQT09TpUneWmR0mVrMa28AkdnFKdjm0gPNuSFr+47XRz051sjQjWVzdJAczzDNYBjHXmSE3
igM5nmDruHfNcliZrjmL+uj36FN8/EZY7ycSd2ML3L4+Iyx3k2k/sYRZ5MUxM8qMx8xTCdDbGtrh
XsoiLt/b0UZ865rO2i8nWJaHBmFqqfAkoO8AQpXibbkz0F066LL26Hyn/Sqd/O6IL3fEZY7ycSd2
ML3KqcaXWSTtF9JTVKrUGwNpDNpsVua4VMCBTfJWmO9602/VBM9O97rqyTOsuz/L4c0S2bfG0z8n
E+XDIz0lilCepHfX007SqLNn45kjew/4DMiC9SIizgiIgIiICIiAiIgKiWiL/D3ofPbsrfvkKr2q
iWiL/D3ofPbsrfvkKiZWW6HS5MzzQySeyHzLMJ8Nsam+FppRMTLn29aifTTv/aFTyRdGOzu01PYE
6AQ5dlki8RZcdId6jxwxw6adau2/RiP6u9kZcudaT0Yk1vZto9eUiT4nk8xgM5QDfD8wPiJgt8LK
Lz69O/4ppy05FUX4dPBR7+9HSXL/AGPmPNr+2/rc7cXi1p50kaiI3yg1xSKGZq+mZ8mKO36d07ld
Kr8vv8Ongo9/enw6eCj396Ozd9g1pky2fzwzwGqNpzXMjo3sryzkegmDmFCB3reoCObuMM/AraTZ
+OZI3sP+AzIqDSHWoonWTMv+bZf2ud0D7ver8zZ+OZI3sP8AgMyIzr1IiICIiAiIgIioraFowDJQ
nKYJUAkodwgy+4ENcU0x6KgR4xAeW960uO9w8CC9SLnJq5Xvk9bO3i/BJq5Xvk9bO3i/BImlpi4s
6Nqmmibk2dI00WaWmSiwkzR5DnjlHswcIqOdeA3QN4E1oFsgaC43Qtv5/fTq/VyvfJ62dvF+CTVy
vfJ62dvF+CRTKI1v9rhVfTitDa4lRt+IQyv8ePl3/mOno/rKvP497VfzZy+wn/8AkaxvVyvfJ62d
vF+CTVyvfJ62dvF+CQZJ8e9qv5s5fYT/APyNPj3tV/NnL7Cf/wCRrG9XK98nrZ28X4JNXK98nrZ2
8X4JBktW3u1WrWqV6mhqMh14e3EhsD/w7e4mXLt8NNGfLtLxs8a7TbTreWu1SaJJMkVtltrIhRob
gK6wL5kazAxBRL6E2uBtOy1PU+lQGrle+T1s7eL8Emrle+T1s7eL8Eg6Noucmrle+T1s7eL8Emrl
e+T1s7eL8EiaWmLizo2i5yauV75PWzt4vwS9YOjkdqItS82fN9MHTfO6W/l6fduo9+TnyoUtMXFn
RZFHNp0NybQHKDUiVIJ4Ax8KHEy+Zvgt83+FSKKFx2m1hCmO32fwHOsRcBn6eHkqGHG0g4wdna3h
4uomWn5xueHrsSuKtr5jsxWzzy4hxiGlxDm1wPAIh+YjwchWtCsvP9fTmyImVluh0ySWYLMY0TCa
zMbxK4zwBJ8KKPEKKjwKSfjRZw71LzsbTiG39jrRl6PGZpblRnd67YewzTNDrNB88OEN4b3XXzbQ
0P8AMbOJdBbjs0dsRiDtiPzUb817+qTJ4mtwIjEkvZFeNEFbxfN3WBAgjs7pjAgoggWVvCBbTtkO
nnXrBtBnQcM8CDMjhUHdIryUVD03z94eN1roZugFiPzth26udGpuS2OVW0QCDNtSNjB7oBZ+1lQw
yvMSfc5Cly6Cuwnrp0xa7wnbasKDcM+MZcNjJZgyudKNlbNMLOY7eUFoM0M0KIO64Vho5nkIGW6e
ha9O12JhO01boZ+HTJEyv5lVyqEuseNUeBWgB0hRIvpg7Pc8JFLzfN10Ey7XPSvEd8dRarVUGPIh
VGM8h0aocPPc3Ay53soTskTqdCCwjTZdJFUBhEeHhvqHzQLMBUJwiOjpirbg7o8M4mES8EyOTc9b
k7LYi5b9O5e9+QSQ5HIPbQK40QLD7L2e0J+cXh/KgAOJBjW0bF0XEFyuQN+dsRocNlHWnX/TTpuB
O81CtxjPBfjKgBmI6bD1rp+zG61zL3QCxHPi1DduqvzQJrmIVxDeILwRUcW8AdqFJy/Is4YtIeF5
PXQbhsfh/NkoyoMqtBYpaYnKXiWCNDMAeGYd5KbxynWOCGRihgZQrU7GhNrgcDrTdDe39zVsKeW2
RWtweplryfEJEpeWeXBZfDeigQQ/7LBvBbnrIL05xvYje0t/6Gf9eiHh8dn83EnhwiOBmlDi6ZEy
eZHDpyiiiCepA/q/L9qyODaXO48euVBmQzTogoAEWmJCFj6cOz7k+mg5b83beIbq5s+ZBkMSRWkO
1iNIVeMYS1jvJAGmRIukH3e60mCil/p2fJRz56Fkkj2fyu4yu2zC9huZNeIBawfFGDKuN88j2pnM
abprL6cWXTRw5d5aTHenUV1qv0FyMqPUM/FMUvWvsQoLvl6veT077aefOtisdr81tppR7g5GOFeG
wzQzM0OHGFBgM7hMgtzxQQQILD/VBMjfky/ag2KyysyOUtupLPBiS6NPkpS+KU1kFX+hnIDtmlBn
oKELN9Rcd0NkaeMOlY4PJsrzPEPGl6W31sJlueJflyKPEehY8d9b3gt4vd7voVLeyvjdhOIcVdNL
bn1U4TjMjpEMjGPBFeuYA3tZUOHdYEDDgyhHgMUQQL0IFuODEcNjt/byr951os7uMZtJNmRxrxms
/GW+vDi6RHxjjQu5emnfrBxQbpIs3kgkVkmIOoPXAhtdpDo9M8tv7o7QHLyEa2gwQUR2egct+csW
2Ww6l0asKD2H59dWgENRUs2ZEs7UQyBkNU0RcPIKv0CER5UmXu6F0+o8HNvqEjWmz1GiAV68yGVK
7WeSe1XeEKPhpBgtzLulIQOsgXEHdZvyYU67fPTCvUzTDNMYPGXIh2jBwrqBDifIBj/RhBAvQgeF
v+xB3JlP+60sewWj/aw1kSx6WIdeDLctwY1SJUiQ2FnhRYcT8jsWH/39ealZCjOKNIbW0qJpxIAZ
Mb/EIFFjxsn9e7pyKSRBE4Ix8UNfUBe9MEY+KGvqAvepZEETgjHxQ19QF70wRj4oa+oC96lkQROC
MfFDX1AXvTBGPihr6gL3qWRBE4Ix8UNfUBe9MEY+KGvqAvepZEETgjH
这是我的发帖方法
private void PostInfo() {
bitmap = ((BitmapDrawable) defoult.getDrawable()).getBitmap();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] imageBytes = baos.toByteArray();
imageString = Base64.encodeToString(imageBytes, Base64.DEFAULT);
ArrayList<String> filePaths = new ArrayList<>();
filePaths.add(imageString);
Log.d("strinimagess",imageString);
//filePaths.add("file:///storage/emulated/0/DCIM/Camera/IMG_20191207_131304.jpg");
// filePaths.add("file:///storage/emulated/0/DCIM/Camera/IMG_20191207_131300.jpgg");
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);
builder.addFormDataPart("skill_years", nameField.getText().toString());
builder.addFormDataPart("skill_where", nameField1.getText().toString());
builder.addFormDataPart("about_work", nameField2.getText().toString());
builder.addFormDataPart("skill_id", skill_id);
builder.addFormDataPart("user_id", user_id);
for (int i = 0; i < filePaths.size(); i++) {
File file = new File(filePaths.get(i));
builder.addFormDataPart("skill_images", file.getName(), RequestBody.create(MediaType.parse("multipart/form-data"), file));
}
MultipartBody requestBody = builder.build();
jsonObject = new JsonObject();
jsonObject.addProperty("skill_years", nameField.getText().toString());
jsonObject.addProperty("skill_where", nameField1.getText().toString());
jsonObject.addProperty("about_work", nameField2.getText().toString());
jsonObject.addProperty("skill_id", skill_id);
jsonObject.addProperty("user_id", user_id);
jsonObject.addProperty("skill_images", String.valueOf(myImageList));
RetrofitInterface jsonpost = ServiceGenerator.createService(RetrofitInterface.class,"http://littletreasure.org.in/");
Call<InFo_Post> call = jsonpost.post(requestBody);
call.enqueue(new Callback<InFo_Post>() {
@Override
public void onResponse(Call<InFo_Post> call, retrofit2.Response<InFo_Post> response) {
if (response.isSuccessful()){
Log.d("response", String.valueOf(response.body().getMsg()));
Toast.makeText(Info.this, "success", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<InFo_Post> call, Throwable t) {
Log.d("Onfail",t.getMessage());
Toast.makeText(Info.this, "failed", Toast.LENGTH_SHORT).show();
}
});
我编写了一个方法,该方法获取图像的路径数组并返回StringBase64的数组
private ArrayList<String> imagesBase64(ArrayList<String> filePathes){
ArrayList<String> imagesBase64=new ArrayList<>();
for (int i = 0; i <filePathes.size() ; i++) {
Bitmap bm = BitmapFactory.decodeFile(filePathes.get(i));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is the bitmap object
byte[] b = baos.toByteArray();
String imgString = Base64.encodeToString(b, Base64.NO_WRAP);
imagesBase64.add(imgString);
}
return imagesBase64;
}
专用ArrayList imagesBase64(ArrayList文件路径){
ArrayList imagesBase64=新的ArrayList();
对于(inti=0;i您是否只有位图,或者您是否还有一个包含该图像的文件?
您可以尝试从数据创建MultypartBody
private void sendFileToServer(String fileName) {
File file = new File(fileName);
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestFile);
...
...
}
另外,不要忘记在WebService类中在post方法中添加注释@Multipart
private void PostInfo() {
bitmap = ((BitmapDrawable) defoult.getDrawable()).getBitmap();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] imageBytes = baos.toByteArray();
imageString = Base64.encodeToString(imageBytes, Base64.DEFAULT);
ArrayList<String> filePaths = new ArrayList<>();
filePaths.add(imageString);
Log.d("strinimagess",imageString);
//filePaths.add("file:///storage/emulated/0/DCIM/Camera/IMG_20191207_131304.jpg");
// filePaths.add("file:///storage/emulated/0/DCIM/Camera/IMG_20191207_131300.jpgg");
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);
builder.addFormDataPart("skill_years", nameField.getText().toString());
builder.addFormDataPart("skill_where", nameField1.getText().toString());
builder.addFormDataPart("about_work", nameField2.getText().toString());
builder.addFormDataPart("skill_id", skill_id);
builder.addFormDataPart("user_id", user_id);
for (int i = 0; i < filePaths.size(); i++) {
File file = new File(filePaths.get(i));
builder.addFormDataPart("skill_images", file.getName(), RequestBody.create(MediaType.parse("multipart/form-data"), file));
}
MultipartBody requestBody = builder.build();
jsonObject = new JsonObject();
jsonObject.addProperty("skill_years", nameField.getText().toString());
jsonObject.addProperty("skill_where", nameField1.getText().toString());
jsonObject.addProperty("about_work", nameField2.getText().toString());
jsonObject.addProperty("skill_id", skill_id);
jsonObject.addProperty("user_id", user_id);
jsonObject.addProperty("skill_images", String.valueOf(myImageList));
RetrofitInterface jsonpost = ServiceGenerator.createService(RetrofitInterface.class,"http://littletreasure.org.in/");
Call<InFo_Post> call = jsonpost.post(requestBody);
call.enqueue(new Callback<InFo_Post>() {
@Override
public void onResponse(Call<InFo_Post> call, retrofit2.Response<InFo_Post> response) {
if (response.isSuccessful()){
Log.d("response", String.valueOf(response.body().getMsg()));
Toast.makeText(Info.this, "success", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<InFo_Post> call, Throwable t) {
Log.d("Onfail",t.getMessage());
Toast.makeText(Info.this, "failed", Toast.LENGTH_SHORT).show();
}
});
确保API可以处理多个文件。使用多部分文件列表设置接口类
Part还用于发送实际文件名
List parts=new ArrayList();
如果(photoUri!=null){
增加(准备部分(“照片”,照片));
}
RequestBody description=createPartFromString(“您好,我是description”);
//创建上载服务客户端
FileUploadService=ServiceGenerator.createService(FileUploadService.class);
//最后,执行请求
Call Call=service.uploadMultipleFileDynamic(描述,部分);
call.enqueue(…);
你可以参考这个官方链接:r
您可以使用multipart或base64两个解决方案发布它,具体取决于您的后端endpoint@yousef我想用base64发布它,但我不知道如何发送它,我该怎么做?我刚刚尝试了你的代码,但它显示了类似“java.lang.IllegalStateException:预期的BEGIN_对象,但在第1行第48列路径处是BEGIN_数组”的错误,那么信息发布呢请在我添加了信息后查看上面的模型类。您有什么帮助吗?我看到了信息后的模型。我认为数据模型不是模型InfoPost中的数组对象。我必须将位图base64发送到服务器。我不想使用多部分发送图像,我想发送多个图像的位图
@Multipart
@POST("upload")
Call<ResponseBody> uploadMultipleFilesDynamic(
@Part("description") RequestBody description,
@Part List<MultipartBody.Part> files);
@NonNull
private RequestBody createPartFromString(String descriptionString) {
return RequestBody.create(
okhttp3.MultipartBody.FORM, descriptionString);
}
@NonNull
private MultipartBody.Part prepareFilePart(String partName, Uri fileUri) {
File file = FileUtils.getFile(this, fileUri);
RequestBody requestFile =
RequestBody.create(
MediaType.parse(getContentResolver().getType(fileUri)),
file
);
return MultipartBody.Part.createFormData(partName, file.getName(), requestFile);
}
List<MultipartBody.Part> parts = new ArrayList<>();
if (photoUri != null) {
parts.add(prepareFilePart("photo", photoUri));
}
RequestBody description = createPartFromString("hello, this is description speaking");
// create upload service client
FileUploadService service = ServiceGenerator.createService(FileUploadService.class);
// finally, execute the request
Call<ResponseBody> call = service.uploadMultipleFilesDynamic(description, parts);
call.enqueue(...);