首页 > 文章列表 > 怎么使用Java服务器处理图片上传

怎么使用Java服务器处理图片上传

java
185 2023-04-24

怎么使用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指:前端的h6的控件的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;

    }

 

}