王学岗Retrofit初探(二)——文件的上传

第一部分
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类型,是一张图片
第三部分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值