Java实现图片上传返回上传地址
**关于在实际开发中最常用也是用的最多的Java实现文档、图片上传。**
*一、准备阶段*
文档、图片上传有几种方式,包括传统的ajax上传,云上传,这里给大家实现通过代码将图片上传至七牛云服务器并返回图片地址。
1.需申请一台七牛云服务器地址(可免费试用30天)
![](https://img-blog.csdnimg.cn/20200731134344400.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMzg4NjU0,size_16,color_FFFFFF,t_70)
==注册登陆成功后可申请试用30天,点击空间管理,即可新增空间==![](https://img-blog.csdnimg.cn/20200731134522292.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMzg4NjU0,size_16,color_FFFFFF,t_70)
==新增成功点击进空间,会给你个测试域名用来返回图片地址调用,当然可以添加自己的域名,具体参考七牛云服务器描述==
*二、代码准备*
只需要提供接口controller以及业务service包即可
**话不多说!上代码!**
```java
package com.ymzd.shop.controller.fileupload;
import com.ymzd.shop.service.IUploadService;
import com.ymzd.shop.common.ResultData;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
/**
* @author wangzhic
* @date 2019-12
*/
@RestController
@RequestMapping("/upload")
@Api(tags = "文件上传接口", description = "wangzhicheng")
public class UploadController {
@Resource
private IUploadService uploadServiceImpl;
/**
* 获取七牛云的token
*
* @return
*/
@GetMapping("/gettoken")
@ApiOperation(value = "获取上传token", notes = "获取token无需要参数")
public ResultData<String> getUpToken() {
String upToken = uploadServiceImpl.getUpToken();
if (upToken != null && upToken.length() != 0) {
return new ResultData<String>().success(upToken);
} else {
return new ResultData<String>().error("token获取失败!");
}
}
/**
* 上传文件到七牛云服务器
*
* @param files
* @param request
* @return
*/
@PostMapping(value = "/files", headers = "content-type=multipart/form-data")
@ApiOperation(value = "文件上传接口", notes = "文件上传api必须用表单方式提交")
public ResultData<String> upLoadFile(@ApiParam(value = "files", required = true)
@RequestParam("files") MultipartFile[] files,
HttpServletRequest request) {
String url = "";
if (files.length == 1) {
if (files[0].getSize() > 5 * 1024 * 1024) {
return new ResultData<String>().error("单个图片不能大于5M!");
} else {
try {
url = uploadServiceImpl.uploadFile(files[0]);
//return new ResultData<String>().success(url);
} catch (Exception e) {
return new ResultData<String>().error("图片大于5M,请重新上传!");
}
}
} else {
for (MultipartFile file : files) {
if (StringUtils.isEmpty(file)) {
return new ResultData<String>().error("文件为空请重新上传!");
} else if (file.getSize() > 5 * 1024 * 1024) {
return new ResultData<String>().error("单个图片不能大于5M!");
} else {
try {
url += uploadServiceImpl.uploadFile(file) + " ";
System.out.println("回调地址:" + url);
} catch (Exception e) {
return new ResultData<String>().error("图片大于5M,请重新上传!");
}
}
}
}
return new ResultData<String>().success(url);
}
}
```
可设置上传大小,这里我设置了单个图片不能超过5M
```java
servlet:
multipart:
max-file-size: 25MB
max-request-size: 50MB
```
该配置表示单个文件不超过25M 单个请求的总文件大小不超过 50M
```java
package com.ymzd.shop.service.impl;
import com.ymzd.shop.service.IUploadService;
import com.ymzd.shop.util.QiniuCloudUtil;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
@Service
public class UploadServiceImpl implements IUploadService {
/**
* 获取七牛云token
*
* @return
*/
@Override
public String getUpToken() {
return QiniuCloudUtil.getupToken();
}
/**
* 上传文件到七牛云
*
* @param file
*/
@Override
public String uploadFile(MultipartFile file) throws Exception {
byte[] bytes = null;
System.out.println("fileName="+file.getOriginalFilename());
try {
bytes = file.getBytes();
} catch (IOException e) {
e.printStackTrace();
}
return QiniuCloudUtil.uploadFileBytes(bytes,file.getOriginalFilename());
}
}
```
业务块代码
```java
package com.ymzd.shop.util;
import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.common.Zone;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import com.qiniu.util.Base64;
import com.qiniu.util.StringMap;
import com.qiniu.util.UrlSafeBase64;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import org.apache.tomcat.util.http.fileupload.FileUploadBase;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
public class QiniuCloudUtil {
private static Properties properties = new Properties();
// 设置七牛云账号的AK和SK
private static String ACCESS_KEY = null;
private static String SECRET_KEY = null;
// 要上传的空间bucket
private static String BUCKET = null;
//外链地址:这里要改成自己的域名
private static String DOMAIN = null;
private static SimpleDateFormat simpleDateFormat;
private static int i = 1;
static {
try {
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("qiniuyun.properties"));
ACCESS_KEY = properties.getProperty("accessKey");
SECRET_KEY = properties.getProperty("secretKey");
BUCKET = properties.getProperty("hostname");
DOMAIN = properties.getProperty("DOMAIN");
simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取七牛云Token
*/
public static String getupToken() {
//秘钥配置上传的凭证
Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
StringMap putPolicy = new StringMap();
putPolicy.put("returnBody", "{\"fileUrl\": \"" + DOMAIN + "$(key)\"}");//上传成功后是返回这个json数据,fileUrl就是的地址
long expireSeconds = 3600;//过期时间
String upToken = auth.uploadToken(BUCKET, null, expireSeconds, putPolicy);
System.out.println(upToken);
return upToken;
}
/**
* @param
* @return 外键地址
*/
//普通上传
public static String uploadFile() {
//文件的外链地址
StringBuffer fileUrl = new StringBuffer(DOMAIN);
//构造一个带指定Zone对象的配置类
Configuration cfg = new Configuration(Zone.zone2());
UploadManager uploadManager = new UploadManager(cfg);
//如果是Windows情况下,格式是 D:\\qiniu\\test.png
String localFilePath = "/Users/leeyunt/Downloads/1864602-3d5d1de100e459b8.png";
//默认不指定key的情况下,以文件内容的hash值作为文件名
String key = null;
try {
//上传文件
Response response = uploadManager.put(localFilePath, key, getupToken());
//解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
System.out.println(putRet.key);
System.out.println(putRet.hash);
fileUrl.append(putRet.key);
} catch (QiniuException ex) {
Response r = ex.response;
System.err.println(r.toString());
try {
System.err.println(r.bodyString());
} catch (QiniuException ex2) {
//ignore
}
}
return fileUrl.toString();
}
//base64方式上传
public static String uploadFileBase64(byte[] base64, String key) throws Exception {
String file64 = Base64.encodeToString(base64, 0);
Integer l = base64.length;
String uploadUrl = "http://up-z2.qiniup.com/putb64/" + l + "/key/" + UrlSafeBase64.encodeToString(key);
//非华南空间需要修改上传域名
//上传文件
RequestBody rb = RequestBody.create(null, file64);
Request request = new Request.Builder().
url(uploadUrl)
.addHeader("Content-Type", "application/octet-stream")
.addHeader("Authorization", "UpToken " + getupToken())
.post(rb).build();
//System.out.println(request.headers());
OkHttpClient client = new OkHttpClient();
okhttp3.Response response = client.newCall(request).execute();
System.out.println(response);
return DOMAIN + key;
}
//字节数组上传
/**
* 字节上传
*
* @param uploadBytes
* @param fileName
* @return 链接地址
* @throws Exception
*/
public static String uploadFileBytes(byte[] uploadBytes, String fileName) throws Exception {
//文件的外链地址
StringBuffer fileUrl = new StringBuffer("https://"+DOMAIN);
//构造一个带指定Zone对象的配置类
Configuration cfg = new Configuration(Zone.zone2());
UploadManager uploadManager = new UploadManager(cfg);
//默认不指定key的情况下,以文件内容的hash值作为文件名
//System.out.println("截取文件:"+fileName.substring(fileName.indexOf(".")));
String key = simpleDateFormat.format(new Date())+ i + fileName.substring(fileName.indexOf("."));
i++;
//秘钥配置上传的凭证
Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
String upToken = auth.uploadToken(BUCKET);
try {
//上传文件
Response response = uploadManager.put(uploadBytes, key, upToken);
//解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
System.out.println(putRet.key);
System.out.println(putRet.hash);
fileUrl.append("/" + putRet.key);
//MyPutRet myPutRet=response.jsonToObject(MyPutRet.class);
//System.out.println(myPutRet);
} catch (QiniuException ex) {
Response r = ex.response;
System.err.println(r.toString());
try {
System.err.println(r.bodyString());
} catch (QiniuException ex2) {
//ignore
}
}
return fileUrl.toString();
}
}
```
这里附上工具类,经过我不断发现问题,多次加工完成,我所返回的地址为“https”的加密路径,所以七牛云必须配置自己的域名。
上传差不多就这个,返回的字符即是图片地址,即可访问。==盆友开始编码吧!==
Java实现图片上传返回上传地址的更多相关文章
- ios 上浏览器返回上一页不会刷新页面问题,页面初始化的方法不执行
https://blog.csdn.net/yang450712123/article/details/79276102 https://blog.csdn.net/Chengbin_Huang/ar ...
- [moka同学收藏]网页上的“返回上一页”的几种实现代码
我们在制作网页的时候,经常在网页上要用到"返回上一页"的功能.这一功能在制作网页的时候会有多种编码方法,在此,笔者将比较常用的几种编码写作方法在下面列出来,供各位技术人员参考使用. ...
- Java 将图片转成base64,传到前台展示
后台代码: public String getBase64(SysFile sysFile){ String imgStr = ""; try { File file = new ...
- 在CentOS 7 上设置返回上一级目录的快捷键为 Backspace
参考这里. 编辑文件: $ vi ~/.config/nautilus/accels 找到这一行: ; (gtk_accel_path "<Actions>/ShellActi ...
- java多图片上传--前端实现预览--图片压缩 、图片缩放,区域裁剪,水印,旋转,保持比例。
java多图片上传--前端实现预览 前端代码: https://pan.baidu.com/s/1cqKbmjBSXOhFX4HR1XGkyQ 解压后: java后台: <!--文件上传--&g ...
- java多图片上传
2017-09-16 <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2 ...
- java web图片上传和文件上传
图片上传和文件上传本质上是一样的,图片本身也是文件.文件上传就是将图片上传到服务器,方式虽然有很多,但底层的实现都是文件的读写操作. 注意事项 1.form表单一定要写属性enctype=" ...
- Java Struts图片上传至指定文件夹并显示图片
继上一次利用Servlet实现图片上传,这次利用基于MVC的Struts框架,封装了Servlet并简化了JSP页面跳转. JSP上传页面 上传一定要为form加上enctype="mult ...
- ssm使用Ajax的formData进行异步图片上传返回图片路径,并限制格式和大小
之前整理过SSM的文件上传,这次直接用代码了. 前台页面和js //form表单 <form id= "uploadForm" enctype="multipart ...
- SpringBoot图片上传(五) 上一篇的新版本,样式修改后的
简单描述:一次上传N张图片(N可自定义):上传完后图片回显,鼠标放到已经上传的图片上后,显示删除,点击后可以删除图片,鼠标离开后,图片恢复. 效果:一次上传多个图片后的效果 上传成功: 鼠标悬浮到图片 ...
随机推荐
- 小程序modal弹窗
[注意]css放的位置可能影响效果 参考a-level competitionFilterCover 1.容器:position: absolute; top: 100vh; animation: m ...
- 公式b-(a-b)
- encodeURI和encodeURIComponent
encodeURI和encodeURIComponent的作用对象都是URL,唯一的区别就是编码的字符范围: encodeURI不会对ascii字母.数字.~!@#$&*()=:/,;?+' ...
- 【6】python之时间模块
时间模块(time和datetime) 表示时间的方式: 1.时间戳(1970至今的时间间隔总秒数) 2.格式化的字符串(按照固定格式的时间字符串) 3.元组(9个元素形成) ps:UTC世界标准时间 ...
- TCP连接connect函数返回错误
如果是 TCP 套接字,那么调用 connect 函数将激发 TCP 的三次握手过程,而且仅在连接建立成功或出错时才返回.其中出错返回可能有以下几种情况: 三次握手无法建立,客户端发出的 SYN 包没 ...
- vue clickoutside 点击元素以外的区域隐藏该元素
一.什么是VueUseVueUse不是Vue.use !!!它是一个基于 Composition API 的实用函数集合,下面是具体的一些用法二.如何引入import { 具体方法 } from '@ ...
- c++ 继承访问控制初步
访问控制方式这里有篇很好的文章,其实内容也是总结c++primer上的内容 现在就按照这篇的文章举例进行学习. 思路 不同继承方式的影响主要体现在: 1.派生类成员对基类成员的访问控制. 2.派生类对 ...
- SpringBoot接口防刷
一.自定义注解 import java.lang.annotation.Retention; import java.lang.annotation.Target; import static jav ...
- 实现一个网页同时调用多个倒计时 jquery/js
最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js2 var plugJs={ stamp:0, tid:1, stam ...
- 在cesium中导出图片
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...