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);
//设置多个文件的总大小为300mb
fileUpload.setSizeMax(1024*1024*300);
try {
//解析request
List<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 = shangchuang
System.out.println(fieldName+" = "+value);
}else{
//如果是文件表单项
//获取文件的大小
long size = fileItem.getSize();
//判断size是否为0
if(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.jsp
request.getRequestDispatcher("/index.jsp").forward(request, response);
}catch(SizeLimitExceededException e){
//一但捕获到该异常,则说明单个文件大小超过限制。
//设置一个错误消息
request.setAttribute("msg", "所有文件大小请不要超过300mb");
//转发到index.jsp
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.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>() {
@Override
public void accept(String s) throws Exception {
// Log.e(TAG,"s:"+s);
}
}, new Consumer<Throwable>() {
@Override
public 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 stub
doGet(request, response);
}
}
Android实现图片下载:
public interface LoginService {
//http://localhost:8080/Web001/images/b1.png
// 下载头像, 把uid携带传递上去,服务器返回数据流
@GET("DownloadServlet")
@Streaming
Observable<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>>() {
@Override
public 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>() {
@Override
public void accept(Bitmap bitmap) throws Exception {
homeImg.setImageBitmap(bitmap);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.e(TAG,"图片下载->错误是:"+throwable);
}
});
}
源码地址: https://download.csdn.net/download/dreams_deng/12244407