Как сохранить как изображение из потока, который отправляется в retrofit2 на веб-сервис wcf - PullRequest
2 голосов
/ 23 октября 2019

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

В Android я создаю как

//ApiInterface.class
@Multipart
@POST("RestService/json/PostUploadFile/")
Call<UploadFileResponse> uploadFile(@Part MultipartBody.Part file); 

вызов службы будет похож на

File file = new File(assets.get(0).getPath());
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);

// MultipartBody.Part is used to send also the actual file name
MultipartBody.Part part = MultipartBody.Part.createFormData("imageData", file.getName(), requestFile);

//api call method
callUploadFile(part, this);

private void callUploadFile(MultipartBody.Part part,
                               MainInteractor.OnFinishedListener listenerP) {
            final MainInteractor.OnFinishedListener listener = listenerP;

            HashMap<String, String> headerMap = new HashMap<>();
            headerMap.put("SessionID", "");
            headerMap.put("UserName", "");
            OkHttpClient httpClient = ConnectToService.newInstance().addHeaders(getContext(), headerMap);

            ApiInterface apiService =
                    ConnectToService.newInstance()
                            .getClient(httpClient).create(ApiInterface.class);

            Call<UploadFileResponse> call = apiService.uploadFile(part);
            call.enqueue(new Callback<UploadFileResponse>() {
                @Override
                public void onResponse(Call<UploadFileResponse> call, Response<UploadFileResponse> response) {
                    onFinished(response.body().getResult());
                }

                @Override
                public void onFailure(Call<UploadFileResponse> call, Throwable t) {
                    if (t.getLocalizedMessage() != null) {
                        onFinishedFailure(t.getLocalizedMessage());
                    }
                }
            });
        }

В веб-службе wcf я получаю данные в сообщении, но при сохранении получаю ошибку исключения аргумента. Getting Data in message Getting error when i save

РЕДАКТИРОВАНИЕ: ниже работает код

Bitmap bm = BitmapFactory.decodeFile(assets.get(finalX).getPath());
                        Bitmap bitmap = Bitmap.createScaledBitmap(bm, 480, 480, true);
                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
                        bitmap.compress(Bitmap.CompressFormat.JPEG, 80, baos); //bm is the bitmap object
                        byte[] byteArray = baos.toByteArray();
                        RequestBody body = RequestBody.create(MediaType.parse("application/octet-stream"), byteArray);
                        callUploadFile(body, "File_" + finalX, MainFragment.this);

метод вызова

private void callUploadFile(RequestBody body, String fileName,
                           MainInteractor.OnFinishedListener listenerP) {
        final MainInteractor.OnFinishedListener listener = listenerP;

        HashMap<String, String> headerMap = new HashMap<>();
        headerMap.put("SessionID", "");
        headerMap.put("UserName", "");
        headerMap.put("FileName", fileName);
        OkHttpClient httpClient = ConnectToService.newInstance().addHeaders(getContext(), headerMap);

        ApiInterface apiService =
                ConnectToService.newInstance()
                        .getClient(httpClient).create(ApiInterface.class);

        Call<UploadFileResponse> call = apiService.uploadFile(body);
        call.enqueue(new Callback<UploadFileResponse>() {
            @Override
            public void onResponse(Call<UploadFileResponse> call, Response<UploadFileResponse> response) {
                if (response != null && response.body() != null) {
                    onFinished(response.body().getResult());
                } else {
                    if (response.message() != null) {
                        onFinishedFailure(response.message());
                    }
                }
            }

            @Override
            public void onFailure(Call<UploadFileResponse> call, Throwable t) {
                if (t.getLocalizedMessage() != null) {
                    onFinishedFailure(t.getLocalizedMessage());
                }
            }
        });
    }

В услуге wcf

public string uploadFile(Stream imageData)
        {
            string fileName = WebOperationContext.Current.IncomingRequest.Headers.Get("fileName");
            string fileFullPath = "D:\\Share\\srinidhi\\Temp_" + fileName + ".Jpeg";

            Image img = System.Drawing.Image.FromStream(imageData);
            img.Save(fileFullPath, ImageFormat.Jpeg);

            return "success";
        }

В API вызов

@POST("RestService/json/PostUploadFile/")
    Call<UploadFileResponse> uploadFile(@Body RequestBody bytes);

1 Ответ

0 голосов
/ 23 октября 2019

Кажется, что ваш поток представлен данными формы, что означает, что поток содержит некоторые ненужные данные, такие как другие данные в отправленных данных формы. Следует отметить одну вещь, что WCF не поддерживает данные формы по умолчанию, мы обычно конвертируем данные в полные данные файла, используя стороннюю библиотеку, MultipartParser .
Вотстраница загрузки.
http://antscode.blogspot.com/2009/11/parsing-multipart-form-data-in-wcf.html
В этом случае используйте следующие сегменты кода для сохранения изображения.

public async Task UploadStream(Stream stream)
        {
            //the third-party library.
            MultipartParser parser = new MultipartParser(stream);

            if (parser.Success)
            {
                //absolute filename, extension included.
                var filename = parser.Filename;
                var filetype = parser.ContentType;
                var ext = Path.GetExtension(filename);
                using (var file = File.Create(Path.Combine(HostingEnvironment.MapPath("~/Uploads"), Guid.NewGuid().ToString() +ext)))
                {
                    await file.WriteAsync(parser.FileContents, 0, parser.FileContents.Length);
                }
            }
}

Если поток представляет собой полный двоичный файл, рассмотрите приведенный ниже код(мы используем заголовок HTTP, чтобы сохранить расширение файла, так как WCF не позволяет содержать другой параметр в сигнатуре метода).

public async Task UploadStream(Stream stream)
        {
            var context = WebOperationContext.Current;
            string filename = context.IncomingRequest.Headers["filename"].ToString();
            string ext = Path.GetExtension(filename);
            using (stream)
            {
                //save the image under the Uploads folder on the server-side(root directory).
                using (var file = File.Create(Path.Combine(HostingEnvironment.MapPath("~/Uploads"), Guid.NewGuid().ToString() + ext)))
                {
                    await stream.CopyToAsync(file);
                }
            }
        }

Не стесняйтесь сообщить мне, если проблема все еще существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...