Android上传头像或上传文件之Retrofit2 使用@Multipart使用标签@PartMap
发布日期:2021-07-01 00:00:09
浏览次数:2
分类:技术文章
本文共 6755 字,大约阅读时间需要 22 分钟。
前言
早上到下午搞了一天的bug 因为突然停电,导致android studio 不能正常运行 所有的项目都不能运行 xml乱码 项目乱码 R文件丢失 等问题! 心态极度崩溃 最后功夫不负有心人 还好解决了
以上文字和博文没有任何牵连 只是被bug搞的很崩溃 再次记录一下
进入正题
后台希望我们传一个file格式的图片 上传到服务器 然后返回一个服务器保存的图片地址 类似这样的格式 /static/images/upload/20200818/ccf0fca9f8c37bed259e0d71707c005c.jpg
最后我们请求接口获取到这个地址 加上服务器域名即可显示这个图片
看下实现效果
请求格式
使用Retrofit2
@Multipart @POST(HttpService.UPLOAD_AVATAR) Observable> uploadAvatar(@PartMap Map files, @Part MultipartBody.Part file);
Presenter层代码逻辑实现
1.先实现对参数的封装
//创建 RequestBody,用于封装构建RequestBody private RequestBody toRequestBody(String value) { RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain"), value); return requestBody; }
2.再操作接口
/** * 上传头像 * * @param path */ @Override public void uploadAvatar(String path) { //文件格式 File file = new File(path); // 创建 RequestBody,用于封装构建RequestBody RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file); //和后端约定好Key,这里的partName是用file MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestFile); if (UserUtils.getUserInfo() == null) return; String userId = UserUtils.getUserInfo().getId() + ""; String token = StringUtils.getToken(); Mapparams = new HashMap<>(); params.put("user_id", toRequestBody(userId)); params.put("appid", toRequestBody(APP_ID)); params.put("token", toRequestBody(token)); mCompositeDisposable.add(mFullOilApi.uploadAvatar(params, body) .subscribeOn(Schedulers.io()) .doOnSubscribe(new Consumer () { @Override public void accept(Disposable disposable) throws Exception { mCompositeDisposable.add(disposable); mPersonalInfoView.requestStart(); } }) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer >() { @Override public void accept(BaseBean baseBean) throws Exception { mPersonalInfoView.requestComplete(); if (baseBean.getCode() == SUCCESS) { if (UserUtils.getAppConfig() != null) { String apiUrl = UserUtils.getAppConfig().getApp_url(); //按照后台要求拼接图片地址 String imaUrl = apiUrl + "/static/images/upload/" + baseBean.getData().get(0).getSaveName(); mPersonalInfoView.changeUserAvatar(imaUrl); } } else { mPersonalInfoView.showErrorMessage(baseBean.getMessage()); } } }, new Consumer () { @Override public void accept(Throwable throwable) throws Exception { mPersonalInfoView.showErrorMessage(HttpUtils.getHttpErrorMessage(mContext, throwable)); mPersonalInfoView.requestComplete(); } })); }
总结
如此头像上传就完成了 不过上传头像之前需要裁切 我是找的第三方组件
//裁剪图片 implementation 'com.github.yalantis:ucrop:2.2.1'
代码实现在这里也贴出来共享一下
//头像裁减public class CropActivity extends AppCompatActivity { public static final String EXTRA_PATH = "extra_path"; public static final int REQUEST_CODE = 33; private Unbinder mUnbinder; @BindView(R.id.toolbar) Toolbar mToolbar; @BindView(R.id.ucropview) UCropView mUCropView; private GestureCropImageView mCropImage; private OverlayView mOverlayView; private String mOutputPath; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_crop); StatusBarUtils.transparencyBar(this); mUnbinder = ButterKnife.bind(this); setSupportActionBar(mToolbar); getSupportActionBar().setDisplayShowTitleEnabled(false); mToolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onBackPressed(); } }); mCropImage = mUCropView.getCropImageView(); mOverlayView = mUCropView.getOverlayView(); mCropImage.setTransformImageListener(mCropListener); mCropImage.setRotateEnabled(false); mOverlayView.setShowCropGrid(false); String cacheDir = FileUtils.getAppPath(); File file = new File(cacheDir, "ucrop_user_avatar.jpg"); mOutputPath = file.getAbsolutePath(); Uri destinationUri = Uri.fromFile(file); String path = getIntent().getStringExtra(EXTRA_PATH); try { mCropImage.setImageUri(Uri.parse(path), destinationUri); } catch (Exception e) { e.printStackTrace(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_confirm, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { mCropImage.cropAndSaveImage(Bitmap.CompressFormat.JPEG, 70, new BitmapCropCallback() { @Override public void onBitmapCropped(@NonNull Uri resultUri, int offsetX, int offsetY, int imageWidth, int imageHeight) { Log.e("CropActivity", "裁剪图片成功" + resultUri); File file = new File(mOutputPath); if (file.exists()) { Log.e("CropActivity", "图片大小" + file.getTotalSpace()); } Intent intent = new Intent(); intent.putExtra(EXTRA_PATH, mOutputPath); setResult(RESULT_OK, intent); finish(); } @Override public void onCropFailure(@NonNull Throwable t) { Log.e("CropActivity", "裁剪图片失败"); } }); return true; } private TransformImageView.TransformImageListener mCropListener = new TransformImageView.TransformImageListener() { @Override public void onRotate(float currentAngle) { } @Override public void onScale(float currentScale) { } @Override public void onLoadComplete() { mCropImage.setTargetAspectRatio(1); mCropImage.postTranslate(1, 1); } @Override public void onLoadFailure(@NonNull Exception e) { } }; @Override protected void onDestroy() { super.onDestroy(); mUnbinder.unbind(); }}
共勉
我要一步一步往上爬
在最高点乘着叶片往前飞 任风吹干流过的泪和汗 我要一步一步往上爬 等待阳光静静看着它的脸 小小的天有大大的梦想 我有属于我的天 任风吹干流过的泪和汗 总有一天我有属于我的天
转载地址:https://lvshichunqiu.blog.csdn.net/article/details/108111038 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月28日 16时11分03秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
linux进程、线程与cpu的亲和性(affinity)
2019-05-01
C语言检查ip是否合法
2019-05-01
linux 获取网络状态信息(Rtnetlink)
2019-05-01
linux netlink通信机制
2019-05-01
记录几个经典的字符串hash算法
2019-05-01
pt-osc vs ghost
2019-05-01
iterm2 的问题
2019-05-01
#pragma message预编译指令使用技巧
2019-05-01
微软C/C++ 编译器选项参考
2019-05-01
VS 2005使用map文件查找程序崩溃原因
2019-05-01
VC下发布的Release版程序的异常捕捉
2019-05-01
DivX和XviD不能不说的故事
2019-05-01
C++异常中的堆栈跟踪
2019-05-01
使用dbghelp获取调用堆栈--release下的调试方法
2019-05-01
Windows系统编程之异步I/O和完成端口
2019-05-01
HTML5 播放器
2019-05-01
对Linux内核中进程上下文和中断上下文的理解
2019-05-01
自旋锁spinlock
2019-05-01
Handle table中CAS操作与A-B-A Problem解析
2019-05-01