使用springmvc上传文件所用到的依赖有
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.5</version>
</dependency>
上传阿里云对象存储的依赖有
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.16.1</version>
</dependency>
springmvc的配置文件中要配置文件解析器,但是这个bean的id只能是multipartResolver,不然会出错。
<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver">
<property name="defaultEncoding" value="UTF-8"></property>
<!-- 最大为10M:1024*1024*10-->
<property name="maxUploadSize" value="10485760"></property>
</bean>
前端的文件上传使用form表单和thymeleaf,要设置method为post,entype为multipart/form-data,
<form th:action="@{/test}" method="post" enctype="multipart/form-data">
头像:<input type="file" name="file">
<input type="submit" value="上传">
</form>
controller层代码为
@RequestMapping(value = {"/test"})
@ResponseBody
public String testController(@RequestParam("file") MultipartFile uploadFile, HttpServletRequest request){
System.out.println("------------");
System.out.println(uploadFile.getOriginalFilename());
String testaaa = UpPictureToOss.upLodeVegetableImg(uploadFile, "testaaa.jpg");
System.out.println(testaaa);
return "index";
}
@RequestParam里面的内容要和前端上传文件中的name一致,其中UpPictureToOss.upLodeVegetableImg()是我写的使用阿里云对象存储的工具类,第一个参数为上传的图片,第二个参数为图片的名字(当然根据自己需要设置),工具类代码为
import com.aliyun.oss.*;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectRequest;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.IOException;
public class UpPictureToOss {
private final static String AccessKeyId="你的AccessKeyId";
private final static String AccessKeySecret="你的AccessKeySecret";
private final static String EndPoint="你的endpoint";
private final static String BucketName="你的bucket";
//下面这是我自己在bucket里面设置的文件夹,用于设置图片保存位置
private final static String CarouselPicture="carousel/";
private final static String VegetablePicture="vegetable/";
private final static String Firfile="agriculture/";
public static String upLodeVegetableImg(MultipartFile file,String fileName){
OSS client = new OSSClientBuilder().build(EndPoint, AccessKeyId, AccessKeySecret);
try {
// 创建PutObjectRequest对象。
ObjectMetadata metadata = new ObjectMetadata();
// 点击链接不会直接下载图片,如果不使用这个metadata也行,但是访问图片链接的时候会直接下载图片,使用了metadata设置setContentType("image/jpg")就能预览图片而不是直接下载
metadata.setContentType("image/jpg");
PutObjectRequest putObjectRequest = new PutObjectRequest(BucketName, Firfile+VegetablePicture+fileName, new ByteArrayInputStream(file.getBytes()),metadata);
client.putObject(putObjectRequest);
} catch (IOException e) {
e.printStackTrace();
return null;
}catch (OSSException oe){
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
return null;
}catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
return null;
} finally {
if (client != null) {
client.shutdown();
}
}
String url="https://"+BucketName+"."+EndPoint+"/"+Firfile+VegetablePicture+fileName;
return url;
}
}
主要的流程参照这个文档:开发文档
AccessKeyId和AccessKeySecret在这里获取
进去向下划就能看到了,如果没有就创建一个,最后的那个URL就是上传图片的地址,通过这个地址就能使用img标签显示出来了。
OK,结束!!!