上传图片返回url java_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 getUpToken() {
String upToken = uploadServiceImpl.getUpToken();
if (upToken != null && upToken.length() != 0) {
return new ResultData().success(upToken);
} else {
return new ResultData().error("token获取失败!");
}
}
/**
* 上传文件到七牛云服务器
*
* @param files
* @param request
* @return
*/
@PostMapping(value = "/files", headers = "content-type=multipart/form-data")
@ApiOperation(value = "文件上传接口", notes = "文件上传api必须用表单方式提交")
public ResultData 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().error("单个图片不能大于5M!");
} else {
try {
url = uploadServiceImpl.uploadFile(files[0]);
//return new ResultData().success(url);
} catch (Exception e) {
return new ResultData().error("图片大于5M,请重新上传!");
}
}
} else {
for (MultipartFile file : files) {
if (StringUtils.isEmpty(file)) {
return new ResultData().error("文件为空请重新上传!");
} else if (file.getSize() > 5 * 1024 * 1024) {
return new ResultData().error("单个图片不能大于5M!");
} else {
try {
url += uploadServiceImpl.uploadFile(file) + " ";
System.out.println("回调地址:" + url);
} catch (Exception e) {
return new ResultData().error("图片大于5M,请重新上传!");
}
}
}
}
return new ResultData().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”的加密路径,所以七牛云必须配置自己的域名。
上传差不多就这个,返回的字符即是图片地址,即可访问。==盆友开始编码吧!==
上传图片返回url java_Java实现图片上传返回上传地址相关推荐
- ios上传图片文件到服务器,iOS 图片以文件形式上传到服务器
如果调用相机,相册请查看这里: http://www.jianshu.com/p/4384efc6fb04 调用上传图片方法 [self postRequestWithURL:@"URL地址 ...
- 文件上传漏洞 (上传知识点、题型总结大全-upload靶场全解)
文件上传漏洞 什么是文件上传漏洞 什么是webshell 一句话木马大全 产生文件上传漏洞的原因 文件上传漏洞的攻击与防御方式 1.前端限制 2.检查扩展名 1.黑名单策略, 2.白名单策略 3.检查 ...
- 在win10本地开发springboot项目能上传图片,并能通过URL直接从浏览器访问,但是部署到服务器上后能上传文件,但是通过浏览器无法访问图片
在win10本地开发springboot项目能上传图片,并能通过URL直接从浏览器访问,但是部署到服务器上后能上传文件,但是通过浏览器无法访问图片 1.首先springboot项目在Window和Li ...
- kindeditor java 上传图片_java中KindEditor本地图片上传与上传失败问题
此代码是最新版的 KindEditor 3.5.x 实现本地图片上传的方法,用于oschina即将改版的个人空间 KindEditor 要求的JSON格式如下: {"error": ...
- anguarjs 上传图片预览_前端图片上传那些事儿
本文转自:掘金 作者:chess 前言 本文讲的图片上传,主要是针对上传头像的.大家都知道,上传头像一般都会分成以下 4 个步骤: 选择图片 -> 预览图片 -> 裁剪图片 -> 上 ...
- ajax 不能上传图片,自己动手打造ajax图片上传(网上没有的)
今天笔者需要一款图片上传插件,但是网上没有提供一款符合自己需求且好用的.于是就自己动手写了一个. 方法1,仅使用jquery代码,不用第三方插件.代码如下 上传图片 $(function() { $( ...
- vue-tinymce的使用,粘贴文件上传,自定义文件上传,改base64转换成上传到服务器返回url
vue-tinymce的使用,粘贴文件上传,自定义文件上传,改base64转换成上传到服务器返回url vue中使用 <vue-tinymcev-model="itemForm.con ...
- php 批量上传图片插件,ajaxImageUpload——一个jQuery图片批量上传插件
ajaxImageUpload 原创jQuery图片上传插件,支持批量上传.预览.删除.放大.上传数量.上传大小.追加方式配置以及上传前.上传中和上传后的回调函数. 演示地址:http://www.g ...
- ssm使用Ajax的formData进行异步图片上传返回图片路径,并限制格式和大小
之前整理过SSM的文件上传,这次直接用代码了. 前台页面和js //form表单<form id= "uploadForm" enctype="multipart/ ...
最新文章
- Docker学习笔记(4) — 开启Docker远程访问
- searchsploit工具(exploit-db.com)使用实例 (linux 内核漏洞提权) exploitdb
- 主流Java数据库连接池比较及前瞻
- strcpy函数的使用
- 经典shell面试题整理
- 【Iphone 游戏开发】游戏引擎剖析
- Android安全机制(2) Android Permission权限控制机制
- java scanner_Java Scanner nextDouble()方法与示例
- Django文件上传***
- ES8新特性_async函数---JavaScript_ECMAScript_ES6-ES11新特性工作笔记048
- 【流媒體】live555—VS2010 下live555编译、使用及测试
- java 钩子 64位 操作系统_Java与系统钩子
- eclipse测试java程序_java-同一项目中的Eclipse junit测试
- javaEE版eclipse设置默认编码格式为utf-8
- 为什么选择使用Sass而不是Less?
- VMware Workstation 虚拟机中的 虚拟交换机和地址规划
- linux下安装oracle instant client,linux下安装Oracle instant client
- 局域网共享工具_局域网共享精灵 V1.0局域网便携共享文件+打印机——墨涩网
- 倍福PLC选型--如何看电机是多圈绝对值还是单圈绝对值编码器
- 微信小程序图片无法显示时显示默认图片
热门文章
- 【老生谈算法】matlab实现支持向量机的回归拟合——混凝土抗压强度预测
- oracle中inner left right full 的使用
- 单片机课堂思考题-2000秒倒计时?
- 卧槽,小小的单例模式竟然有这么多种写法?
- DBA_USERS中ACCOUNT_STATUS中用户状态LOCKED在不同数据库版本的差异
- 服务器粘贴不能用,重启rdpclip.exe
- 7-1 插入排序法 (100 分)(C语言版)
- java实现html语法检查函数_Html或JS语法检测之JSLint工具
- JavaScript语法规范
- Edge 超越 Safari 成为全球第二大桌面端浏览器!Firefox 爆降致 Chrome 份额再创新高!...