Retrofit2实现图片上传下载携带token校验
1、 android Retrofit2 实现图片上传携带基本数据token校验
1.1. 服务端代码:
package com.denganzhi.project;import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;/*** Servlet implementation class FileUploadServlet*/
@WebServlet("/FileUploadServlet")
public class FileUploadServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//解决post请求的乱码//request.setCharacterEncoding("utf-8");/* //获取一个输入流ServletInputStream in = request.getInputStream();//读取流String str = IOUtils.toString(in);System.out.println(str);*/System.out.println("----开始------");//获取工厂类实例DiskFileItemFactory factory = new DiskFileItemFactory();//创建解析器类实例ServletFileUpload fileUpload = new ServletFileUpload(factory);//fileUpload通过该对象来限制文件的大小//设置当文件的大小为50KB//fileUpload.setFileSizeMax(1024*50);//设置多个文件的总大小为300mbfileUpload.setSizeMax(1024*1024*300);try {//解析requestList<FileItem> fileItems = fileUpload.parseRequest(request);//遍历fileItems,读取表单的信息for (FileItem fileItem : fileItems) {//判断当前表单项是否是一个普通表单项// 这里获取普通表当的键值对if(fileItem.isFormField()){//获取属性名String fieldName = fileItem.getFieldName();//获取属性值String value = fileItem.getString("utf-8");// uid = 1010100101 输出内容// name = shangchuangSystem.out.println(fieldName+" = "+value);}else{//如果是文件表单项//获取文件的大小long size = fileItem.getSize();//判断size是否为0if(size==0){continue;}//获取文件的类型String contentType = fileItem.getContentType();//获取文件的名字String name = fileItem.getName();//判断name中是否包含有路径信息if(name.contains("\\")){//如果包含则截取字符串name = name.substring(name.lastIndexOf("\\")+1);}//生成一个UUID,作为文件名的前缀String prefix = UUID.randomUUID().toString().replace("-", "");name = prefix+"_"+name;//获取表单项的属性名String fieldName = fileItem.getFieldName();System.out.println("文件的大小: "+size);System.out.println("文件的类型: "+contentType);System.out.println("文件的名字: "+name);System.out.println("表单项name属性名: "+fieldName);//获取ServletContext对象ServletContext context = this.getServletContext();//获取项目的真实路径String path = context.getRealPath("/upload");//判断路径是否存在File file = new File(path);if(!file.exists()){//如果不存在该路径,则创建一个路径file.mkdirs();}File destFile=new File(path+"/"+name);//将文件写入到磁盘中fileItem.write(destFile);System.out.println("文件绝对路径:"+destFile.getAbsolutePath());}}//重定向到一个页面//response.sendRedirect(request.getContextPath()+"/success.jsp");response.getWriter().append("success");}catch(FileSizeLimitExceededException e){//一但捕获到该异常,则说明单个文件大小超过限制。//设置一个错误消息request.setAttribute("msg", "单个文件大小请不要超过50KB");//转发到index.jsprequest.getRequestDispatcher("/index.jsp").forward(request, response);}catch(SizeLimitExceededException e){//一但捕获到该异常,则说明单个文件大小超过限制。//设置一个错误消息request.setAttribute("msg", "所有文件大小请不要超过300mb");//转发到index.jsprequest.getRequestDispatcher("/index.jsp").forward(request, response);}catch (FileUploadException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
图片真实路径上传以后 :code20181225\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\Web001\upload\db0193b12ac749c8bff1a5ecceb1834d_ic_launcher.png
1.2.JSP实现图片下载测试:
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body><h1>上传文件</h1><p style="color: red">${msg }</p><form action="FileUploadServlet" method="post" enctype="multipart/form-data">用户名 <input type="text" name="name" /> <br /> <br />照片 <input type="file" name="photo1" /> <br /> <br />照片 <input type="file" name="photo2" /> <br /> <br />照片 <input type="file" name="photo3" /> <br /> <br /><input type="submit" value="提交" /></form>
</body>
</html>
1.3.实现图片下载依赖库:
compile 'io.reactivex.rxjava2:rxjava:2.0.8'compile 'io.reactivex.rxjava2:rxandroid:2.0.1'compile 'com.squareup.retrofit2:retrofit:2.1.0'
// 添加Retrofit2的依赖compile 'com.squareup.retrofit2:converter-gson:2.1.0' // RxJava必须要指定返回数据类型解析器,指定gson,那么直接返回List或者Bean,Gson解析器compile 'com.squareup.retrofit2:converter-scalars:2.1.0'
// 如果RxJava服务器返回的是字符串,那么使用这个字符串解析器,字符串解析器compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0' // retrofit2和 rxjava 结合库
1.4.LoginService 定义接口:
public interface LoginService {
// 上传头像@Multipart@POST("FileUploadServlet")Observable<String> getPicturesBean(@Part("uid") RequestBody uid, @Part MultipartBody.Part file);
}
1.5.Android代码实现:
// 准备把 assert下 图片拷贝到sd卡中public void sendRequestYuan(View view) throws IOException {AssetManager manager = getAssets();// 会自动去assert目录下找InputStream is = manager.open("ic_launcher.png");// 会自动打开 /data/data/packageName/file 目录FileOutputStream fos = openFileOutput("ic_launcher.png", Context.MODE_PRIVATE);//3. 边读边写byte[] buffer = new byte[1024];int len = -1;while((len=is.read(buffer))!=-1) {fos.write(buffer, 0, len);}fos.close();is.close();}/*** 文件上传Post请求*/public void uploadFile(View view) {String filesPath = getFilesDir().getAbsolutePath()+"/ic_launcher.png";Log.e(TAG,"filepath:"+filesPath);Retrofit retrofit2 = new Retrofit.Builder().baseUrl("http://192.168.168.157:8080/Web001/").addCallAdapterFactory(RxJava2CallAdapterFactory.create()).addConverterFactory(ScalarsConverterFactory.create()).build();// 这个值当作token校验String uid="1010100101";File file = new File(filesPath);/**uid 用于提交普通表当,实际上传服务器可以用于携带token,ui表单格式:<form action="FileUploadServlet" method="post" enctype="multipart/form-data">用户名 <input type="text" name="name" /> <br /> <br /> // 这里用于携带普通表单照片 <input type="file" name="photo1" /> <br /> <br /> // 这里用于携带图片</form>*/RequestBody uidBody = RequestBody.create(MediaType.parse("multipart/form-data"), uid);MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", file.getName(), RequestBody.create(MediaType.parse("image/*"), file));LoginService loginService= retrofit2.create(LoginService.class);loginService.getPicturesBean(uidBody, filePart).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<String>() {@Overridepublic void accept(String s) throws Exception {// Log.e(TAG,"s:"+s);}}, new Consumer<Throwable>() {@Overridepublic void accept(Throwable throwable) throws Exception {// Log.e(TAG,"throwable:"+throwable);}});}
2. Android实现图片下载发送GET请求Token校验下载
2.1.服务器代码实现图片下载:
package com.denganzhi.project;import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class DownloadServlet*/
@WebServlet("/DownloadServlet")
public class DownloadServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public DownloadServlet() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(request.getParameter("uid"));//获取项目的真实路径String path =getServletContext().getRealPath("/upload");//判断路径是否存在,图片路径,是上传的图片路径File file = new File(path);File destFile=new File(path+"/"+"4fd20f4150c5497d93c8a0acb539f70a_ic_launcher.png");//获取web的上下文路径,System.out.println(destFile.getAbsolutePath());byte[] data = null; FileInputStream fis = new FileInputStream(destFile);ByteArrayOutputStream baos = new ByteArrayOutputStream();int len;byte[] buffer = new byte[1024];while ((len = fis.read(buffer)) != -1) {baos.write(buffer, 0, len);}data = baos.toByteArray();System.out.println("data大小:"+data.length);response.getOutputStream().write(data);baos.close();fis.close();}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}
Android实现图片下载:
public interface LoginService {//http://localhost:8080/Web001/images/b1.png// 下载头像, 把uid携带传递上去,服务器返回数据流@GET("DownloadServlet")@StreamingObservable<ResponseBody> downloadUserHead(@Query("uid") String uid);
}
Android实现下载代码:
public void downloadImg(View view) {Retrofit retrofit2 = new Retrofit.Builder().baseUrl("http://192.168.168.157:8080/Web001/").addCallAdapterFactory(RxJava2CallAdapterFactory.create()).addConverterFactory(GsonConverterFactory.create()).build();LoginService loginService= retrofit2.create(LoginService.class);// 携带参数,图片下载做校验loginService.downloadUserHead("uuuuiiidddd").subscribeOn(Schedulers.io()).flatMap(new Function<ResponseBody, ObservableSource<Bitmap>>() {@Overridepublic ObservableSource<Bitmap> apply(ResponseBody responseBody) throws Exception {byte[] bys = new byte[0];bys = responseBody.bytes(); //注意:把byte[]转换为bitmap时,也是耗时操作,也必须在子线程Log.e(TAG,"图片大小是:"+bys.length);final Bitmap bitmap = BitmapFactory.decodeByteArray(bys, 0, bys.length); // 在子线程中进程return Observable.just(bitmap);}}).subscribe(new Consumer<Bitmap>() {@Overridepublic void accept(Bitmap bitmap) throws Exception {homeImg.setImageBitmap(bitmap);}}, new Consumer<Throwable>() {@Overridepublic void accept(Throwable throwable) throws Exception {Log.e(TAG,"图片下载->错误是:"+throwable);}});}
源码地址: https://download.csdn.net/download/dreams_deng/12244407
Retrofit2实现图片上传下载携带token校验相关推荐
- 微信js-sdk图片上传下载——java完整流程
最近做的一个项目刚好用到微信js-sdk的图片上传接口,在这里做一下总结. 在这里能知道使用js api的基本配置https://mp.weixin.qq.com/wiki?t=resource/re ...
- 文件 图片 上传 及少许正则校验
文件 & 图片 上传 及少许正则校验 <template><div style="padding: 20px"><Row><Col ...
- Android开发中使用七牛云存储进行图片上传下载
Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储 ...
- 用cn.hutool工具包进行图片上传下载示例
文章目录 实体类 controller service 数据转换的工具类 file工具类 Hutool-http针对JDK的HttpUrlConnection做一层封装,简化了HTTPS请求.文件上传 ...
- Java实现七牛云文件或图片上传下载
写在前面 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:人工智能学习网站 文章目录 写在前面 一.准备工作 1.1.为什么选择七牛云? 1.2.七牛云注册 二.ja ...
- ssm上传文件获取路径_SSM实现图片上传下载功能
0. 基本步骤框架搭建 实现带图片上传的注册功能 实现下载功能 1. 框架搭建 Step1 创建开发项目 创建基础MVC包结构:controller.service.mapper.pojo Step2 ...
- ssm框架验证码图片加载不出_基于SSM框架的文件图片上传/下载功能实现
前一段时间很多做毕业设计的同学问:如何写图片和文件的上传下载功能,今天正好有时间,所以就做了一个案例,详细的讲解这个功能. 框架结构: 对于很多做过开发的而言,上传功能肯定都用过,而且用到的场景很多, ...
- 图片上传下载-功能实现
文件上传下载 三种方式实现文件上传功能 1. 传统form表单(基本被废弃) 向后台发送数据的三种编码格式 -form表单的enctype属性 application/x-www-form-urlen ...
- 第二篇 ( wcf 与 android 图片上传下载)
老规矩废话不多说,直接入主题 注:wcf 使用rest风格,传递json数据,图片是经过base64编码,android 使用common-codec-1.5.jar 进行base64编码 服务器端 ...
最新文章
- 逻辑回归损失函数(cost function)
- 不能上网--只要四步判断出故障所在
- 某学校学生在计算机等级水平测试中,提高中职学校计算机等级考试(一级)通过率的教学策略研究...
- 题目1549:货币问题
- IQmath中文手册
- TensorFlow 莫烦视频学习笔记例子二(一)
- 在理解通用近似定理之前,你可能都不会理解神经网络
- CG CTF WEB 变量覆盖
- 常见的保险种类,险种分类介绍
- javascript中的模块系统
- 【dfs】【树】机器选择
- NOI 练手题 图像旋转翻转变换
- Bash:字符串操作
- php文件操作基本使用方法
- 用计算机写文章 单元备课,信息技术第一单元单元备课精要.doc
- python 画线条进行到指定区域更改颜色,使用Colormaps在matplotlib中设置线条的颜色...
- wordcount C
- python要背的单词_Python-默背单词
- wampserver mysql乱码_ajax +json +php提交mysql数据库 中文乱码(wamp server 本地测试)求解?...
- Delphi 包的设计思想及它与PAS、BPL、DCU、DLL、OXC的关系
热门文章
- 模型汇总-10 Variational AutoEncoder_变分自动编码器原理解析
- JAVA 游戏开发之——FPS(帧频刷新率)精准控制
- 基于日常工作对亚马逊云计算平台的一点认识
- 会打麻将的人工智能来了
- 01--python 中的列表list 练习题
- hibernate Search 继续研究 增加 hibernate memcache 二级缓存 配置成功 附件maven代码(2)...
- 加入 RRAM 开发战线,Sony 与 Micron 共同发表新成果
- JMDM液位开关/光电开关/门禁信号/红外光电开关控制器
- 【媒体广告】的现状与未来发展趋势!
- Python|游邮APP技术路线