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);
		
		//设置多个文件的总大小为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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值