Java服务器处理图片上传

一、简述

    第一:浏览器上传图片实现;

    第二:微信小程序上传图片实现;

二、图片上传功能实现

    1.处理H5的单文件上传实现:

package cn.ncist.tms.attachment.controller;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
 
/**
 * 附件上传类
 * 
 * @author Fxh
 *
 */
@RequestMapping(value = "/fileUpload")
@Controller
public class AttachmentUpload {
	
	/**
	 * 上传文件功能,以Post请求发送请求,
	 * 
	 * @param request:请求对象
	 * @param reponse:响应对象
	 * @param file:上传的文件对象
	 * @return JSON串 : {"code":"S","msg":"服务调用成功"}
	 * @throws IOException 
	 */
	@RequestMapping(value = "/doFileUpload",method = RequestMethod.POST)
	@ResponseBody
	public Map<String,Object> doFileUpload(HttpServletRequest request,
			HttpServletResponse reponse,
			@RequestParam("file") MultipartFile srcFile) throws IOException{
		
		/*
		 * 注意:传入参数时,文件的注解@ReuqestParam("variable") -->variable指:前端的h5的控件的name值.
		 * 
		 * 文件处理功能: 1.将获取的字节数组转化为文件对象,并保存在本地目录中;
		 * 
		 * 文件处理思路: 1.将获取的(source)file对象,通过函数获取字节数组;
		 * 				2.实例化文件对象和文件输出流;
		 * 				3.将字节数组写入文件即可.
		 * 
		 * 功能难度: 简单.
		 */
		
		//1.变量声明
		Map<String,Object> result = null;// 返回结果变量
		FileOutputStream fos = null; 	//写入文件的变量
		File destFile = null;	//写入的目的地文件(distination)
		
		try {
			result = new HashMap<String,Object>();
			
			//2.参数验证
			if(srcFile == null){
				throw new RuntimeException("上传文件不存在");
			}
			if(srcFile.getBytes().length == 0){
				throw new RuntimeException("上传文件内容为空");
			}
			
			//3.操作文件对象,写入本地目录的文件中
			
			//3.1 截取文件后缀
			String ext = srcFile.getOriginalFilename().substring(srcFile.getContentType().lastIndexOf( ".")+1);
			//3.2 实例化目标文件,根据当前的操作系统,指定目录文件,
			destFile = new File("D:"+File.separator+"descFolder"+File.separator+"descFile."+ext);
			//3.3 实例化流
			fos = new FileOutputStream(destFile);
			//3.4 获取写入的字节数组,并写入文件	
			byte[] srcBytes = srcFile.getBytes();
			fos.write(srcBytes);
			fos.flush();
			//4.对输入、输出流进行统一管理
			//已在文件finally代码块处理
			
			result.put( "code", "S");
			result.put( "msg", "服务调用成功");
			result.put( "path", destFile.getAbsolutePath());
			return result;
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			result = new HashMap<String,Object>();
			result.put( "code", "F");
			result.put( "msg", "服务调用失败");
			result.put( "path", null);
			return result;
		} finally{
			//关闭系统资源,避免占用资源.
			if(fos != null){
				fos.close();
			}
		}
	}
}

2.微信或手机APP上传图片文件的代码实现:

 
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
 
import javax.annotation.Resource;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.jboss.netty.handler.codec.http.HttpRequest;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
 
import com.hlinkcloud.ubp.core.constant.RedisKeyConstant;
import com.hlinkcloud.ubp.core.service.RedisService;
import com.hlinkcloud.ubp.core.util.BaseStringUtil;
import com.hlinkcloud.ubp.facade.bean.common.FastDFSFile;
import com.hlinkcloud.ubp.facade.bean.common.FileManagerConfig;
import com.hlinkcloud.ubp.facade.service.common.FileInfoService;
import com.hlinkcloud.ubp.facade.service.permission.UserService;
import com.hlinkcloud.ubp.facade.util.DictionaryCommUtil;
 
import fr.opensagres.xdocreport.core.io.internal.ByteArrayOutputStream;
 
/**
 * 微信上传图片业务
 * 
 * @author FengQi
 *
 */
@Controller
@RequestMapping("/wx_upload")
public class WxUploadImgBusiness {
 
	@Resource
	private UserService userService;
 
	@Resource
	private RedisService redisService;
 
	@Resource(name = "commonUtil")
	private DictionaryCommUtil commUtil;
 
	@Resource
	private FileInfoService fileService; /* 文件服务 */
	
	@RequestMapping("/getUploadFilePath")
	@ResponseBody
	public Map<String, Object> doWxUploadFile(HttpServletRequest request, HttpServletResponse response) {
 
		HashMap<String, Object> map = new HashMap<String, Object>();
		
		try {
			
			/*
			 * // 注释:该部分是使用在没有使用sprinvMVC的架构下的图片上传. // 1.磁盘文件条目工厂
			 * DiskFileItemFactory factory = new DiskFileItemFactory();
			 * 
			 * //2.1 高速的文件上传处理类 ServletFileUpload sfu = new
			 * ServletFileUpload(factory);
			 * 
			 * List<FileItem> list = sfu.parseRequest(request); FileItem picture
			 * = null; if(list != null && list.size() > 0){ for(FileItem item :
			 * list){ if(!item.isFormField()){ picture = item; } } }
			 */
 
			// 1.将请求转化为操作流的请求对象.
			MultipartHttpServletRequest req = (MultipartHttpServletRequest) request;
			MultipartFile picture = req.getFile("file");
			
			if(picture != null && picture.getBytes().length != 0){
				// 2.将图片上传到服务器
				byte[] bytes = picture.getBytes();
				String ext = picture.getOriginalFilename().substring(
						picture.getOriginalFilename().lastIndexOf(".") + 1
						);
				// (备注:下列代码为内部业务代码,可根据公司自身的需求,进行更改)
				
				
				map.put("code", "S");
				map.put( "msg", "服务调用成功");
				map.put("statusCode", 200);
				map.put("data", filePath);
			}else{
				throw new RuntimeException("上传图片异常或空图片!");
			}
		} catch (IOException e) {
			e.printStackTrace();
			map.put("code", "F");
			map.put("msg", "服务调用失败");
			map.put("statusCode", 500);
			map.put("data", null);
		}
		return map;
	}
	
	/**
	 * 当不知道手机、微信传入前端的参数是什么时,
	 * 
	 * 可调用该接口进行判断.
	 * 
	 * @param request
	 * @param response
	 * @return
	 * @throws IOException
	 */
	@RequestMapping(value = "/doUploadFileOfCI" , method = RequestMethod.POST )
	public @ResponseBody Map<String,Object> doUploadFile(
			HttpServletRequest request,//请求对象
			HttpServletResponse response) throws IOException{//响应对象
		
		System.out.println("doTestMultipartFile:");
		
		MultipartHttpServletRequest req = (MultipartHttpServletRequest) request;
		//此时说明请求对象是MultipartHttpServletRequest对象
		MultipartFile picture = req.getFile("UploadedImage");
		
		//遍历请求得到所有的数据.
		if(req != null){
			
			//获取所有属性名
			Enumeration enume= req.getAttributeNames();
			while(enume.hasMoreElements()){
				System.out.println("enume:"+enume.nextElement());
			}
			
			//获取所有文件名
			Iterator<String> fileNames = req.getFileNames();
			while(fileNames.hasNext()){
				System.out.println("fileNames:"+fileNames.next());
			}
			
			//获取操作文件的map
			Map<String,MultipartFile> fileMap =  req.getFileMap();
			if(fileMap != null && fileMap.size() > 0){
				Set<String> set = fileMap.keySet();
				for(String key:set){
					System.out.println("String:"+key);
				}
			}
			
			//获取请求流
			InputStream is = req.getInputStream();
			System.out.println("InputStream:"+is);
			int length = -1;
			while( (length = is.read()) != -1 ){
				System.err.println("data:"+length);
			}
			
			//获取所有请求参数
			Enumeration enumee = req.getParameterNames();
			while(enumee.hasMoreElements()){
				System.out.println("enumee:"+enumee.nextElement());
			}
		}
		
		System.out.println(picture);
		
		
		return null;
	}
 
}

总结:图片上传均是将图片的字节数据,以HTTP协议(其他编程语言自行定义传输协议) 进行数据的传输,当服务器接收到后,解析HTTP协议的图片数据并封装成Request请求对象,最后通过请求对象便可获取封装好的文件对象。(注:当项目配置SpringMVC的文件上传解析器后,可以在请求方法的参数中传入Multipart类型变量或解析Request对象。)


原文链接:https://blog.csdn.net/qq_41107529/article/details/80900743

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值