Java之~ 上传服务器图片

本文介绍了一个Java项目中使用的文件上传工具类,包括了文件上传的具体实现方式,并提供了详细的代码示例,涵盖文件处理流程、异常处理及图片压缩等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//上传图片文件视频工具类

package com.javajy.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.framework.frext.util.Ajax;
import org.framework.frext.util.FileUtil;

public class FileUploadUtil {

// //1.可以利用Spring的@PropertySource和@Value两个注解从配置文件properties中读取值
// private @Value("#{property['base64FileHandler.host']}") String host;

  //2.服务器地址
  public static String host ="http://localhost:8080/项目图片文件名/";//读取服务器的访问地址
  public static String rootPath= "C://apache-tomcat-8.5.32/webapps/项目图片文件名/";//服务器存放图片的地址(与项目同级)


//请求,响应,抛出异常
public static Map<String, Object> saveCapture(HttpServletRequest request,HttpServletResponse response) throws Exception {

//用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件
response.setContentType("text/html;charset=utf-8");
//存放其他非文件参数
Map<String,Object> resultParam = new HashMap<String,Object>();

String resultfilepath ="" ;//文件路径
List<String> resultList  = new ArrayList<String>();//文件路径数组
//设置时间编码格式
SimpleDateFormat f = new SimpleDateFormat("/yyyy/MM/dd/");
//根据服务器路径生成文件格式
File file = new File(rootPath);
// 判断上传文件和文件目录是否存在
if (!file.exists() && !file.isDirectory()) {
      System.out.println("目录不存在,需要创建");
// 创建目录
//.mkdirs() 建立多级文件夹
      boolean isOk = file.mkdirs(); // 原来 file.mkdir();只能建一级的文件夹会形成找不到文件返回false
      System.out.println(isOk);
}
// 消息提示
String message = "";
try {
     // 使用Apache文件上传组件处理文件上传步骤:
     // 1、创建一个DiskFileItemFactory工厂,设置缓冲区大小和临时文件目录
     DiskFileItemFactory factory = new DiskFileItemFactory();
     // 2、创建一个文件上传解析器
     ServletFileUpload upload = new ServletFileUpload(factory);
     // 3.设置上传文件名编码格式
     upload.setHeaderEncoding("UTF-8");
    // 4、使用ServletFileUpload.parseRequest解析器解析上传数据,解析结果返回的是一个所有上传内容List<FileItem>集合,每 一个FileItem对应一个Form表单的输入项
     List<FileItem> list = upload.parseRequest(request);
     for (FileItem item : list) {
           //isFormField()方法判断某项是否是普通的表单类型。
           // 如果FileItem中封装的是普通输入项的数据
     if (item.isFormField()) {
           String name = item.getFieldName();
           // 解决普通输入项的数据的中文乱码问题
           String value = item.getString("UTF-8");
           System.out.println(name + "=" + value);
           resultParam.put(name, value);
      } else {
//否则该表单项是file 类型的
// 得到上传的文件名称,
     String filename = item.getName();
     System.out.println(filename);
     if (filename == null || filename.trim().equals("")) {
         continue;
     }
// 注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:
// c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
// 处理获取到的上传文件的文件的路径部分,只保留文件名部分
filename = filename.substring(filename.lastIndexOf("\\") + 1);//lastIndexOf最后出现的位置
// 获取item中的上传文件的输入流
InputStream in = item.getInputStream();
//传到远程服务器上文件名(自定义不可重复).
filename= new Date().getTime()+new Random().nextInt(100000)+
                            "."+FileUtil.getExtensionName(filename);//适用所有文件格式(视频)
//设置图片文件名只png图片格式 ".png";
//filename= FileUtil.getFileNameNoEx(filename)+"_"+ DateUtils.toShortDateTime(new Date())+
//   ".png";
//创建一个文件输出流  保存到服务器 rootPath :服务器储存图片路径/项目本地储存图片路径
FileOutputStream out = new FileOutputStream(rootPath + filename);
resultfilepath = FileUploadUtil.host+filename ;//数据库存的路径用来前端读取(原图)
//resultList.add(resultfilepath);//保存返回路径
// 创建一个缓冲区
byte buffer[] = new byte[1024];
// 判断输入流中的数据是否已经读完的标识
int len = 0;
// 循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
while ((len = in.read(buffer)) > 0) {
// 使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\"
// + filename)当中
out.write(buffer, 0, len);
}
//关闭输入流
in.close();
//关闭输出流
out.close();
// 删除处理文件上传时生成的临时文件
item.delete();
message = "文件上传成功!";

//如果你的手机上传的高清图片过大,可以用下面的方法进行压缩()

//判断图片上传格式是图片进行压缩
                    if(("png").equals(FileUtil.getExtensionName(filename))  || ("jpg").equals(FileUtil.getExtensionName(filename))
                            || ("jpeg").equals(FileUtil.getExtensionName(filename)) || ("gif").equals(FileUtil.getExtensionName(filename))
                            || ("psd").equals(FileUtil.getExtensionName(filename)) || ("tiff").equals(FileUtil.getExtensionName(filename))
                            || ("tga").equals(FileUtil.getExtensionName(filename)) || ("eps").equals(FileUtil.getExtensionName(filename))                               || ("bmp").equals(FileUtil.getExtensionName(filename))){

                        String yasuofilename =  new Date().getTime()+"_"+new Random().nextInt(100000) +"yasuo"+
                                "."+FileUtil.getExtensionName(filename);//定义压缩图片的名称(不能重复)

            //调用图片压缩方法,获取压缩后的服务器图片路径
                        String yasopath  = YasuoUtil.scaleNormal(rootPath + filename,rootPath + yasuofilename);//调用阿里图片压缩方法
                        resultfilepath = host+ yasopath.substring(yasopath.lastIndexOf("/") + 1);//重新定义读取服务器压缩图片的地址
                    }

     resultList.add(resultfilepath);//返回图片路径地址
}
}
} catch (Exception e) {
message = "文件上传失败!";
e.printStackTrace();
}
System.out.println(message);
System.out.println(resultList);
if(resultParam.size()<1){//判断是否有普通数据
return Ajax.getSuccessReturnMapWithData(resultList);
}
Map<String,Object> result = new HashMap<String,Object>();
result.put("param", resultParam);//返回普通数据
result.put("images", resultList);//返回String文件路径
return result;
}
}

//压缩工具类在另一篇文章

https://mp.youkuaiyun.com/postedit/82806249        图片压缩方法工具类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值