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
    评论
A: 以下是使用Java代码将图片上传服务器的步骤: 1. 首先,需要创建一个Java文件上传的Servlet,Servlet可以使用Java Web框架如Spring MVC或Servlet API创建。 2. 接下来,需要在Servlet中编写一个POST请求来处理上传的图片。 3. 需要从POST请求中获取上传的文件,可以使用Servlet API提供的Part接口来获得上传的文件。 4. 将获得的Part接口转换为InputStream对象,并将其写入到服务器上的目标文件中。可以使用Java IO类中的FileOutputStream或BufferedOutputStream类来完成这一步骤。 5. 最后,需要在Servlet中设置HTTP响应的内容类型和内容长度,通常可以直接从上传的文件中获得这些信息。 以下是一个可能的Java代码示例: ```java import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.FileOutputStream; import java.io.BufferedOutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; public class FileUploadServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String fileName = request.getParameter("filename"); Part filePart = request.getPart("file"); InputStream in = filePart.getInputStream(); OutputStream out = new BufferedOutputStream(new FileOutputStream(fileName)); byte[] buffer = new byte[1024]; int length; while ((length = in.read(buffer)) > 0) { out.write(buffer, 0, length); } out.close(); in.close(); response.setContentType("text/plain"); response.setContentLength(fileName.length()); response.getWriter().write(fileName + " uploaded successfully"); } } ``` 以上代码示例说明了如何获得上传的文件,将其写入到服务器的目标文件中,然后返回一个HTTP响应。这个例子是基于Servlet API的,如果你使用了Spring MVC框架,你可以使用MultipartFile接口来代替Part接口进行文件上传。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值