第一部分
UploadFileService 接口
package com.tz.architect.retrofit.simple4.inter;
import okhttp3.RequestBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.POST;
/**
* 上传文件至服务器
*
* @author Dream
*
*/
public interface UploadFileService {
//上传使用post的请求,使用Body指定请求体类型,采用body实现图片上传;RequestBody是父类,它有
//两个子类FormBody MultipartBody
@POST("UploadServlet")
public Call<String> uploadImage(@Body RequestBody body);
}
SimpleRetrofitUploadImage 类
package com.tz.architect.retrofit.simple4;
import java.io.File;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.scalars.ScalarsConverterFactory;
import com.tz.architect.retrofit.simple1.SimpleSystemLogin.OnHttpResultListener;
import com.tz.architect.retrofit.simple3.inter.LoginService;
import com.tz.architect.retrofit.simple4.inter.UploadFileService;
/**
* 实现图片上传
*
* @author Dream
*
*/
public class SimpleRetrofitUploadImage {
private static String URL_UPLOAD = "http://192.168.2.1:8080/Dream_Architect_Retrofit_Server/";
public static UploadFileService buildRetrofit() {
Retrofit retrofit = new Retrofit.Builder().baseUrl(URL_UPLOAD)
.addConverterFactory(ScalarsConverterFactory.create()).build();
// loginService实际是一个代理类
return retrofit.create(UploadFileService.class);
}
public static void executeRetrofit(Call<String> callLogin,
final OnHttpResultListener onHttpResultListener) {
try {
callLogin.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call,
Response<String> response) {
onHttpResultListener.onHttpResult(response.body());
}
@Override
public void onFailure(Call<String> call, Throwable t) {
onHttpResultListener.onHttpResult("上传失败!");
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 上传图片,上传图片的关键代码
*
* @param imagePath
* @param onHttpResultListener
*/
public static void uploadImage(String imagePath,
OnHttpResultListener onHttpResultListener) {
UploadFileService uploadFileService = buildRetrofit();
// 构建文件上传body(支持多个)
MultipartBody.Builder builder = new MultipartBody.Builder();
// 上传文件
File file = new File(imagePath);
// 构建文件body
/**MediaType.parse("image/png"):指定文件类型,服务器的文件格式如下:
* text/html : HTML格式
* text/plain :纯文本格式
* text/xml : XML格式
* image/gif :gif图片格式
* image/jpeg :jpg图片格式
* image/png:png图片格式
*/
RequestBody body = RequestBody.create(MediaType.parse("image/png"),
file);
// 注意:file:指定上传的是文件
//body:上传文件的格式
builder.addFormDataPart("file", file.getName(), body);
Call<String> uploadImage = uploadFileService.uploadImage(builder
.build());
executeRetrofit(uploadImage, onHttpResultListener);
}
}
Main类
package com.tz.architect.retrofit;
import android.app.Activity;
import android.os.Bundle;
import com.tz.architect.retrofit.simple1.SimpleSystemLogin;
import com.tz.architect.retrofit.simple1.SimpleSystemLogin.OnHttpResultListener;
import com.tz.architect.retrofit.simple2.SimpleOkHttpLogin;
import com.tz.architect.retrofit.simple3.SimpleRetrofitLogin;
import com.tz.architect.retrofit.simple4.SimpleRetrofitUploadImage;
import com.tz.architect.retrofit.simple5.SimpleRetrofitGson;
import com.tz.architect.retrofit.simple6.SimpleRetrofitXml;
import com.tz.architect.retrofit.simple7.SimpleRetrofitRxJava;
import com.tz.architect.retrofit.simple8.MyRetrofitTest;
import com.tz.architect.retrofit.utils.FileManager;
import com.tz.architect.retrofit.utils.ToastUtil;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// simpleSystemLogin();
// simpleOkHttpLogin();
// simpleRetrofitLoginSync();
// simpleRetrofitLoginAsync();
// simpleRetrofitLoginGetAsync();
// simpleRetrofitLoginGetQueryMap();
// simpleRetrofitUploadImage();
// simpleRetrofitLoginGson();
// simpleRetrofitConvertXml();
// simpleRetrofitRxJava();
simpleMyRetrofitTest();
}
private OnHttpResultListener onHttpResultListener = new OnHttpResultListener() {
@Override
public void onHttpResult(Object result) {
if (result == null) {
ToastUtil.showToast(MainActivity.this, "登录失败!");
} else {
ToastUtil.showToast(MainActivity.this, result.toString());
}
}
};
private void simpleSystemLogin() {
SimpleSystemLogin.login("Hello", "123", onHttpResultListener);
}
private void simpleOkHttpLogin() {
SimpleOkHttpLogin.loginSync("Hello", "123", onHttpResultListener);
}
private void simpleRetrofitLoginSync() {
SimpleRetrofitLogin.loginSync("Hello", "123", onHttpResultListener);
}
private void simpleRetrofitLoginAsync() {
SimpleRetrofitLogin.loginAsync("Hello", "123", onHttpResultListener);
}
// 发送get请求
private void simpleRetrofitLoginGetAsync() {
SimpleRetrofitLogin.loginGet("Hello", "123", onHttpResultListener);
}
private void simpleRetrofitLoginField() {
SimpleRetrofitLogin
.loginPostField("Hello", "123", onHttpResultListener);
}
private void simpleRetrofitLoginGetQueryMap() {
SimpleRetrofitLogin.loginGetQueryMap("Hello", "123",
onHttpResultListener);
}
// 上传图片
private void simpleRetrofitUploadImage() {
String imagePath = FileManager.getRecordFile().getAbsolutePath()
+ "/paint.png";
SimpleRetrofitUploadImage.uploadImage(imagePath, onHttpResultListener);
}
// 上传图片
private void simpleRetrofitLoginGson() {
SimpleRetrofitGson.loginGson("Hello", "123", onHttpResultListener);
}
private void simpleRetrofitConvertXml() {
SimpleRetrofitXml.getUserList();
}
private void simpleRetrofitRxJava() {
SimpleRetrofitRxJava.login("Hello", "123", onHttpResultListener);
}
private void simpleMyRetrofitTest() {
MyRetrofitTest.login("Hello", "123", onHttpResultListener);
}
}
第二部分
上传团徽
先看下服务端
这是接口,需要传入文件和userId,token
// 修改团徽
@Multipart
@POST(RunningGroupURL.POST_ICON_BY_USER)
Observable<PublicResponseEntity<String>> postGroupIconByUser(@Part MultipartBody.Part file, @QueryMap Map<String, String> params);
构建上传的参数, HashMap<String, String> params里面就包括我们需要传入的userID和token
// 上传团队logo
public Observable<PublicResponseEntity<String>> postGroupIconByUser(File file) {
HashMap<String, String> params = UserManager.getUserIdAngTokenParamsMap();
RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part part = MultipartBody.Part.createFormData("file", file.getName(), requestBody);
return mServiceApi.postGroupIconByUser(part,params).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
}
在MainActivity中调用
addDispose(runningGroupViewMoudle.postGroupIconByUser(resultFile).subscribe(new Consumer<PublicResponseEntity<String>>() {
@Override
public void accept(PublicResponseEntity<String> data) throws Exception {
closeLoadingDialog();
if (null != data) {
int code = data.getCode();
if (code == 0) {
saveGroupInfo();
} else if (code == -1) {
// 请登录
} else {
ToaUtils.show(mContext, "图片上传失败,请重试");
}
} else {
ToaUtils.show(mContext,"网络走丢了,请检查网络");
}
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
closeLoadingDialog();
ToaUtils.show(mContext,"网络走丢了,请检查网络");
}
}));
resultFile就是我们的File类型,是一张图片
第三部分