如何从android改造上传图像到服务器
Posted
技术标签:
【中文标题】如何从android改造上传图像到服务器【英文标题】:How to upload Image to server from android retrofit 【发布时间】:2018-04-03 19:10:51 【问题描述】:仍在寻找解决方案。任何人都知道如何做到这一点
我正在将图片从手机上传到服务。图片上传成功但不知道怎么保存
我正在使用compile 'com.squareup.retrofit2:retrofit:2.1.0'
改造方法
@Multipart
@POST("RestService/json/PostKYCDocImg/")
Call<UploadPictureResponse> getURLKYCDocImg(@Part MultipartBody.Part imageData);
在android上传的文件中
File file = new File(new URI(de.getAttachFilePath()).getPath());
RequestBody mFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part image = MultipartBody.Part.createFormData("image", file.getName(), mFile);
Call<UploadPictureResponse> call = apiService.getURLKYCDocImg(image);
在 Wcf 网络服务中,我收到的是
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "/json/PostKYCDocImg/", RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
[FaultContract(typeof(ServiceData))]
string UploadPicture(Stream imageData);
public string UploadPicture(Stream imageData)
//saveImgInSpecPath(fileFullPath, GetBytesFromStream(imageData,
//System.Text.Encoding.UTF8), imageData);
saveImgInSpecPath2(fileFullPath, imageData);
private static Boolean saveImgInSpecPath2(string fileFullPath, Stream imageData)
try
//Save image here which is in imageData as stream and return saved status
//var fileStream = File.Create(fileFullPath);
//imageData.CopyTo(fileStream);
//StreamReader sr = new StreamReader(imageData.InputStream);
//var fileStream = File.Create(fileFullPath);
//imageData.InputStream.Seek(0, SeekOrigin.Begin);
//imageData.InputStream.CopyTo(fileStream);
//here i want to save image file which imageData in the form of stream
bool exists = File.Exists(fileFullPath);
return exists;
catch (Exception ex)
return false;
我在“saveImgInSpecPath2”方法中尝试了很多代码,所有代码都成功上传到服务路径但保存错误
请建议从 android 保存在 wcf webservice 中的正确方法 改造
【问题讨论】:
but when i open image
。完全不清楚您尝试在网络服务器上打开图像的位置、方式和方式。你告诉 Windows 照片查看器什么?
出于测试目的,我在我的系统中托管了 Web 服务,当我转到保存的图像路径时,我无法在打开时看到该图像
byte[] 是否有写入流的 CopyTo 过载?您将流和流的字节一起发送到您的方法中。如果是您调用 CopyTo 方法的流,则流已耗尽,将复制零字节
好吧,准确地告诉你那条路是什么。如果文件在那里,您是否检查过资源管理器?它的大小是多少?和原版一样吗?
这是实际代码吗?
【参考方案1】:
我在我的项目中使用了它。它工作正常。
Stream str = File.OpenRead(@"C:\Users\a.asadi\Pictures\Capture.PNG");
FileStream fs = File.Create(@"C:\Users\a.asadi\Pictures\test.PNG", (int)str.Length);
byte[] bytes = new byte[str.Length];
str.Read(bytes, 0, bytes.Length);
fs.Write(bytes, 0, bytes.Length);
【讨论】:
我会检查并来 fs.WriteByte(memoryStream) 这行有错误 9 参数 1: cannot convert from 'System.IO.MemoryStream' to 'byte' 我已编辑此代码,请查看。并用您的流更改“str”。 在第二行得到了 Specified method is not supported exception. 当调用的方法不受支持,或者尝试读取、查找或写入不支持调用的功能的流时抛出的异常【参考方案2】:// retrofit method APIgetpost(interface java class)
@Multipart
@POST("RestService/json/PostKYCDocImg/")
Call<UploadPictureResponse> getURLKYCDocImg(@Part@Part MultipartBody.Part
file1);
//java类:
public void ProfileupdateExecute()
ApiGetPost service = ApiConstant.getMainUrl().create(ApiGetPost.class);
JSONObject jTestObj = new JSONObject();
if (mediaPath != null)
strImgaepath = mediaPath;
else
strImgaepath = "";
//File creating from selected URL
File file = new File(strImgaepath);
RequestBody requestFile =
RequestBody.create(MediaType.parse("multipart/form-data"), file);
userimage =
MultipartBody.Part.createFormData("photo", file.getName(), requestFile);
try
//photo field name
jTestObj.put("photo", strImgaepath);
catch (JSONException e)
e.printStackTrace();
updatecall = service.ProfileUpdate(userimage);
updatecall.enqueue(new Callback<UpdateTeacherProfileModel>()
@Override
public void onResponse(Call<UpdateTeacherProfileModel> call, Response<UpdateTeacherProfileModel> response)
viewDialog.hideDialog();
if (response.body()!= null)
UpdateTeacherProfileModel userupdate = (response.body());
String Success = userupdate.getSuccess();
if (Success.equalsIgnoreCase("true"))
Toast.makeText(ProfileView_Activity.this, "Success", Toast.LENGTH_SHORT).show();
else
Toast.makeText(ProfileView_Activity.this, "Check your credentials", Toast.LENGTH_SHORT).show();
else
Toast.makeText(getApplicationContext(), "Error..!", Toast.LENGTH_SHORT).show();
@Override
public void onFailure(Call<UpdateTeacherProfileModel> call, Throwable t)
viewDialog.hideDialog();
Toast.makeText(getApplicationContext(), "Please try again", Toast.LENGTH_SHORT).show();
call.cancel();
);
【讨论】:
以上是关于如何从android改造上传图像到服务器的主要内容,如果未能解决你的问题,请参考以下文章
使用改造 2 将图像从画廊/相机上传到服务器(okhttp 问题)
如何使用 phpmyadmin 和 json 从 android 上传和下载图像到服务器?