Javaweb上传图片到阿里云oss服务器

网站实现上传图片到oss对象存储

应用示例:用户头像更换

欢迎访问个人博客  点击访问  可回答问题下载资源

网上很多方法是将上传的头像存在项目的根目录下,但是时间长了肯定影响项目的运行速度。

阿里云的oss和腾讯云的cos提供了对象存储服务,而且价格不贵,企业开发者和个人开发者都适合

本篇介绍的是阿里云的oss对象存储。

第一步

申请阿里云账号,登录账号后找到oss对象存储。

阿里云的对象存储是需要自己购买的,40G一年的空间只需要9块钱,40G的存储空间能满足大多数个人开发者的需求啦,对于企业可以选择更高存储容量的。

第二步

购买完存储容量后就需要设置Bucket,就相当于设置一个存储盘,在bucket中可以新建文件夹。阿里云和腾讯云都提供了对象存储的开发文档,写的都很详细。阿里oss文档    腾讯cos文档

接下来就是前端样式和后端代码

前端样式

上传头像的界面也已经设计好啦

样式截图,这是在图书管理系统中的更换头像应用,博客链接:图书管理系统

下面这个是在手机网站中的界面,原网站是参加软件设计大赛的校园场景识别。网站链接:场景识别

需要的js文件css文件都放在了这个压缩包里:jscss文件

也可以进入网站联系群主即可:加群联系群主

前端代码以及上传图片的限制

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">

	<head>
		<meta charset="UTF-8">
		<title>Document</title>
		
		<script src="head/jquery.min.js"></script>
		
		<link rel="stylesheet" type="text/css" href="http://apps.bdimg.com/libs/bootstrap/3.3.4/css/bootstrap.css">
		<link href="head/cropper.min.css" rel="stylesheet">
		<link href="head/sitelogo.css" rel="stylesheet">
		<link rel="stylesheet" type="text/css" href="http://cdn.bootcss.com/font-awesome/4.6.0/css/font-awesome.min.css">
		
		<script src="head/bootstrap.min.js"></script>
		<script src="head/cropper.js"></script>
		<script src="head/sitelogo.js"></script>
		
		<style type="text/css">
		.avatar-btns button {
			height: 35px;
		}
		</style>
		
		
	</head>

	<body>
	
		<button type="button" class="btn btn-primary"  data-toggle="modal" data-target="#avatar-modal" style="margin: 10px;">修改头像</button>
		
		<div class="user_pic" style="margin: 10px;">
			<img src=""/>
		</div>

		<div class="modal fade" id="avatar-modal" aria-hidden="true" aria-labelledby="avatar-modal-label" role="dialog" tabindex="-1">
			<div class="modal-dialog modal-lg">
				<div class="modal-content">
					<!--<form class="avatar-form" action="upload-logo.php" enctype="multipart/form-data" method="post">-->
					<form class="avatar-form" action="../../upload" method="post" enctype="multipart/form-data">
						<div class="modal-header">
							<button class="close" data-dismiss="modal" type="button">&times;</button>
							<h4 class="modal-title" id="avatar-modal-label">上传图片</h4>
						</div>
						<div class="modal-body">
							<div class="avatar-body">
								<div class="avatar-upload">
									<input class="avatar-src" name="avatar_src" type="hidden">
									<input class="avatar-data" name="avatar_data" type="hidden">
									<label for="avatarInput" style="line-height: 35px;">图片上传</label>
									<button class="btn btn-danger"  type="button" style="height: 35px;" onClick="$('input[id=avatarInput]').click();">请选择图片</button>
									<span id="avatar-name"></span>
									<input class="avatar-input hide" id="avatarInput" name="avatar_file" type="file"></div>
								<div class="row">
									<div class="col-md-9">
										<div class="avatar-wrapper"></div>
									</div>
									<div class="col-md-3">
										<div class="avatar-preview preview-lg" id="imageHead"></div>
										<!--<div class="avatar-preview preview-md"></div>
								<div class="avatar-preview preview-sm"></div>-->
									</div>
								</div>
								<div class="row avatar-btns">
									<div class="col-md-4">
										<div class="btn-group">
											<button class="btn btn-danger fa fa-undo" data-method="rotate" data-option="-90" type="button" title="Rotate -90 degrees"> 向左旋转</button>
										</div>
										<div class="btn-group">
											<button class="btn  btn-danger fa fa-repeat" data-method="rotate" data-option="90" type="button" title="Rotate 90 degrees"> 向右旋转</button>
										</div>
									</div>
									<div class="col-md-5" style="text-align: right;">								
										<button class="btn btn-danger fa fa-arrows" data-method="setDragMode" data-option="move" type="button" title="移动">
							            <span class="docs-tooltip" data-toggle="tooltip" title="" data-original-title="$().cropper(&quot;setDragMode&quot;, &quot;move&quot;)">
							            </span>
							          </button>
							          <button type="button" class="btn btn-danger fa fa-search-plus" data-method="zoom" data-option="0.1" title="放大图片">
							            <span class="docs-tooltip" data-toggle="tooltip" title="" data-original-title="$().cropper(&quot;zoom&quot;, 0.1)">
							              <!--<span class="fa fa-search-plus"></span>-->
							            </span>
							          </button>
							          <button type="button" class="btn btn-danger fa fa-search-minus" data-method="zoom" data-option="-0.1" title="缩小图片">
							            <span class="docs-tooltip" data-toggle="tooltip" title="" data-original-title="$().cropper(&quot;zoom&quot;, -0.1)">
							              <!--<span class="fa fa-search-minus"></span>-->
							            </span>
							          </button>
							          <button type="button" class="btn btn-danger fa fa-refresh" data-method="reset" title="重置图片">
								            <span class="docs-tooltip" data-toggle="tooltip" title="" data-original-title="$().cropper(&quot;reset&quot;)" aria-describedby="tooltip866214">
								       </button>
							        </div>
									<div class="col-md-3">
										<input class="btn btn-danger btn-block avatar-save fa fa-save" type="submit" value="上传头像"/>
									</div>
								</div>
							</div>
						</div>
					</form>
				</div>
			</div>
		</div>

		<div class="loading" aria-label="Loading" role="img" tabindex="-1"></div>
		<script src="head/html2canvas.min.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
		//做个下简易的验证  大小 格式 
			$('#avatarInput').on('change', function(e) {
				var filemaxsize = 1024 * 5;//5M
				var target = $(e.target);
				var Size = target[0].files[0].size / 1024;
				if(Size > filemaxsize) {
					alert('图片过大,请重新选择!');
					$(".avatar-wrapper").childre().remove;
					return false;
				}
				if(!this.files[0].type.match(/image.*/)) {
					alert('请选择正确的图片!')
				} else {
					var filename = document.querySelector("#avatar-name");
					var texts = document.querySelector("#avatarInput").value;
					var teststr = texts; //你这里的路径写错了
					testend = teststr.match(/[^\\]+\.[^\(]+/i); //直接完整文件名的
					filename.innerHTML = testend;
				}
			
			});

			$(".avatar-save").on("click", function() {
				var img_lg = document.getElementById('imageHead');
				// 截图小的显示框内的内容
				html2canvas(img_lg, {
					allowTaint: true,
					taintTest: false,
					onrendered: function(canvas) {
						canvas.id = "mycanvas";
						//生成base64图片数据
						var dataUrl = canvas.toDataURL("image/jpeg");
						var newImg = document.createElement("img");
						newImg.src = dataUrl;
						imagesAjax(dataUrl)
					}
				});
			})
			
			function imagesAjax(src) {
				var data = {};
				data.img = src;
				data.jid = $('#jid').val();
				$.ajax({
					url: "upload-logo.php",
					data: data,
					type: "POST",
					dataType: 'json',
					success: function(re) {
						if(re.status == '1') {
							$('.user_pic img').attr('src',src );
						}
					}
				});
			}
		</script>
	</body>

</html>

接下来就是后端,便于理解,后端采用的是servlet接收图片数据,并存储到项目的虚拟路径,然后经过编码上传到oss服务器。

因为可能涉及到历史头像问题,上传文件名采用随机编码,防止重名替换了原始头像。

servlet代码

package userhead;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
import com.oreilly.servlet.multipart.FileRenamePolicy;

/**
 * Servlet implementation class upload
 */
@WebServlet("/upload")
public class upload extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public upload() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String filename = null;
		String url = null;
		String requextip = request.getRemoteAddr();
		String saveDirectory = this.getServletContext().getRealPath("") + "\\img";
		File savedir = new File(saveDirectory);
		if (!savedir.exists())
			savedir.mkdir();
		int maxPostSize = 10 * 1024 * 1024;
		FileRenamePolicy policy = (FileRenamePolicy) new DefaultFileRenamePolicy();
		MultipartRequest multi;
		multi = new MultipartRequest(request, saveDirectory, maxPostSize, "UTF-8", policy);
		Enumeration<String> files = multi.getFileNames();
		String name = files.nextElement();
		File f = multi.getFile(name);
		if (f != null) {
			filename = f.getName();
		}
		InputStream in = new FileInputStream(f);
		BasicController al = new BasicController();
		url = al.uploadImageToOSS(filename, in);
		request.setAttribute("url", url);
		request.getRequestDispatcher("/upload_head.jsp").forward(request, response);
		doGet(request, response);
	}

}

上面这是接收图片的方法,BasicController类即为上传到oss的类

代码如下

package userhead;

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.PutObjectRequest;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.URL;
import java.sql.Date;
import java.util.Arrays;
import java.util.Iterator;
import java.util.UUID;
import java.util.concurrent.ConcurrentLinkedQueue;

public class BasicController {

	private static String endpoint = "申请的oss区域域名";
	private static String accessKeyId = "申请的accesskeyid";
	private static String accessKeySecret = "申请的accesskeysecret";
	private static String bucketName = "自己创建的bucket名称(大小写要规范)";
	private static String folder = "自己创建文件夹名称/";
	private static String key = "http://【bucket名称】.【区域域名】/";
	public BasicController() {
	}

	public String uploadImageToOSS(String fileName, InputStream inputStream) {

		OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
		try {
			String uuid = UUID.randomUUID().toString().replaceAll("-", "");
			String[] names = fileName.split("[.]");
			String name = uuid + "." + names[names.length - 1];
			ossClient.putObject(new PutObjectRequest(bucketName, folder + name, inputStream));
			return key + folder + name;
		} catch (Exception e) {
			e.printStackTrace();
			System.err.println(e.getMessage());
		} finally {
			ossClient.shutdown();
		}
		return null;
	}
}

所需要的jar包,已经放到csdn可直接下载。jar包下载

按照这样就可以实现web应用的图片上传服务器啦

发布了71 篇原创文章 · 获赞 291 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/lk888666/article/details/103337278