如何将图像另存为在 retrofit2 中发送到 wcf Web 服务的流中的图像

Posted

技术标签:

【中文标题】如何将图像另存为在 retrofit2 中发送到 wcf Web 服务的流中的图像【英文标题】:How to save as Image From Stream which is send in retrofit2 to wcf web service 【发布时间】:2020-02-19 07:12:30 【问题描述】:

我正在使用改造将图像文件发送到 wcf web 服务,在 wcf web 服务的保存端我无法保存流文件。

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 webservice 中,我在消息中获取数据,但是当我保存时,我得到参数异常错误。

已编辑:以下代码有效

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);

【问题讨论】:

图片好像是base64编码的 @TheGeneral你能告诉代码如何保存,我真的不知道如何保存,我搜索了很多但没有任何效果...... 【参考方案1】:

看来你的stream是form-data提交的,也就是说stream中包含了一些不必要的数据,比如提交的form-data中的其他数据。需要注意一点,WCF默认不支持form-data,我们一般使用第三方库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);
                
            
        

如果问题仍然存在,请随时告诉我。

【讨论】:

我已经尝试过 MultipartParser,它只会导致无效的参数异常,因此更改为“application/octet-stream”,现在它可以工作了。感谢您的帮助 感谢分享您的解决方案,代码 sn-ps 很好。

以上是关于如何将图像另存为在 retrofit2 中发送到 wcf Web 服务的流中的图像的主要内容,如果未能解决你的问题,请参考以下文章

matlab中如何将输出的figure中的图像保存在我的文档中

matlab中如何保将显示出来的图像保存

cognos 不能另存为excel

iPhone:如何将视图另存为图像??? (例如保存你画的东西)

如何将表格另存为图像,但又保持其质量? R

如何将面板另存为 BMP