Изображение отправлено с модификацией в WCF не работает - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь отправить изображение, используя модификацию 2, используя приведенный ниже код, но полученное изображение повреждено и не может быть открыто с помощью средства просмотра фотографий Windows. У вас есть два снимка экрана ниже, первый - это содержимое, которое я анализирую как строку, а второе - сообщение, которое я получаю, когда пытаюсь открыть изображение. Я пробовал разные варианты чтения потока отправленного изображения, но ни один не работает. Одним из них является код в wcf, а двумя другими опциями, которые я использовал, является код, который комментируется, но ни один из них не работает. Надеюсь, кто-нибудь может мне помочь.

        @Multipart
        @POST("PostImageJSON")
        Call<String> PostImage(@Part MultipartBody.Part report_image);



                    MediaType imageType = MediaType.parse("image/*");
                    File file = new File(ImagePath+"/savedReportPhoto.jpg");

                    if(file.exists()) {
                        RequestBody requestBodyImage = RequestBody.create(imageType, file);
                        MultipartBody.Part image = MultipartBody.Part.createFormData("uploadedImage", file.getName(), requestBodyImage);
                        Call<String> callSendImage = api.PostImage(image);


                        progress.setTitle("Procesim");
                        progress.setMessage("Duke procesuar..");
                        progress.setCancelable(false); // disable dismiss by tapping outside of the dialog
                        progress.show();

                        callSendImage.enqueue(new Callback<String>() {
                            @Override
                            public void onResponse(Call<String> call, Response<String> response) {
                                if (response.isSuccessful()) {
                                    String responseimg = response.body();

                                    progress.dismiss();
                                } else {
                                    Toast.makeText(getApplicationContext(), "Something went wrong with the request to the server !", Toast.LENGTH_SHORT).show();
                                    progress.dismiss();
                                }
                            }

                            @Override
                            public void onFailure(Call<String> call, Throwable t) {
                                progress.dismiss();
                                Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_SHORT).show();
                            }
                        });

                    }

            [OperationContract]
            [WebInvoke(Method = "POST", UriTemplate = "/PostImageJSON", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json)]
            String PostImage(Stream postedImage);

        public String PostImage(Stream postedImage)
        {
  //Here i parse the stream as string for testing purposes
            StreamReader reader = new StreamReader(postedImage);
            string res = reader.ReadToEnd();

            using (StreamWriter writer = new StreamWriter("F:\\image.txt", true))
            {
                writer.WriteLine(res);
            }


    //First option i have tried
            //do
            //{
            //    bytesRead = postedImage.Read(buffer, 0, buffer.Length);
            //    totalBytesRead += bytesRead;

            //    ms.Write(buffer, 0, bytesRead);
            //} while (bytesRead > 0);

            //using (FileStream fs = File.OpenWrite("F:\\postedImage.png"))
            //{
            //    ms.WriteTo(fs);
            //    fs.Close();
            //    ms.Close();
            //}

            //Second option i have tried
            byte[] buffer = new byte[19127];
            postedImage.Read(buffer, 0, 19127);
            FileStream f = new FileStream("F:\\savedReportPhoto.jpg", FileMode.OpenOrCreate);
            f.Write(buffer, 0, buffer.Length);
            f.Close();
            postedImage.Close();
            return "Recieved the image on server";

  //Third option i have tried
            //FileStream f = new FileStream("F:\\savedReportPhoto.jpg", FileMode.OpenOrCreate);
            //postedImage.CopyTo(f);
            //f.Close();
            //postedImage.Close();
            //return "Recieved the image on server";

          }

Содержимое изображения, которое я получаю в виде строки

Когда я пытаюсь открыть фотографию в Windows PhotoViewer

1 Ответ

0 голосов
/ 03 мая 2018

ОК. Я нашел решение после недолгой борьбы, решение заключалось не в том, чтобы отправить изображение отдельно от других данных, а в том, чтобы закодировать его в виде строки base64 и отправить вместе с объектом, а затем декодировать на сервере и делай что хочешь.

Это метод в интерфейсе модернизации:

 @POST("PostBanderolDataJSON")
    Call<ReportPostData> PostData(@Header("Authorization") String serviceToken,@Body ReportPostData reportdata);

и вот я отправляю данные вместе с кодировкой изображения:

            ReportPostData rpd = new ReportPostData();

            rpd.setBanderolnr(banderoNr);
            rpd.setPharmacy(pharmacy);
            rpd.setPlace(place);

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            Bitmap bmp = Common.loadImageFromStorage(ImagePath);
            if(bmp!=null) {
                bmp.compress(Bitmap.CompressFormat.PNG, 100, baos);
                byte[] imageBytes = baos.toByteArray();
                String encodedImage = android.util.Base64.encodeToString(imageBytes, Base64.DEFAULT);
                rpd.setImageFile(encodedImage);
            }

и добавление изображения к объекту, как показано выше, с помощью строки:

rpd.setImageFile(encodedImage);

и завладеть объектом и отправить его как обычно с модернизацией.

Надеюсь, кто-нибудь найдет это полезным

...