如何将图像另存为在 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中的图像保存在我的文档中