后端如何处理和接受前端上传的文件与图片。
发布时间:2024-11-23 11:45:37
文件上传
前端页面三要素
表单项type=“file
表单提交方式post
表单的enctype属性multipart/form-data
服务端接收文件
MultipartFile接受上传的文件
public Result upload(String username , Integer age , MultipartFile image) throws Exception {
log.info("文件上传:{},{},{}",username,age,image);
//获取原始文件名-1.jpg123.0.0.jp9
String originalFilename = image.getoriginalFilename();
//构造唯一的文件名(不能重复)-uuid(通用唯一识别码)de49685b-61c0-4b11-80fa-c71e95924018
int index = originalFilename.lastIndexOf( str: ".");
String extname = originalFilename.substring(index);
String newFileName = UUID.randomUUID().toString()+extname;
log.info("新的文件名:{}}",newFileName);
//将文件存储在服务器的磁盘目录中E:\images
image.transferTo(newFile(pathname:"E:\\images\\"+newFileName));
returnResult.success();
修改可上传的文件大小限制
配置mybatis的日志,指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
开启mybatis的驼蜂命名自动映射开关a_column------>aCloumn
mybatis.configuration.map-underscore-to-camel-case=true
配置单个文件上传大小限制
spring.servlet.multipart.max-file-size=10MB
配置单个请求最大大小的限制(一次请求中是可以上传多个文件)
spring.servlet.multipart.max-request-size=100MB
String getOriginalFilename);//获取原始文件名
void transferTo(Filedest);//将接收的文件转存到磁盘文件中
longgetSize();//获取文件的大小,单位:字节
byte[] getBytes();//获取文件内容的字节数组
InputStream getlnputStream();//获取接收到的文件内容的输入流
阿里云OSS服务
文件上传准备
前端页面三要素(file表单项、post方式、multipart/form-data) 服务端接收文件(Multipartfile) 文件存储方式
如何使用阿里云
引入依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.17.4</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
</dependency>
Bucket:存储空间是用户用于存储对象(Object,就是文件)的容器,所有的对象都必须隶属于某个存储空间。 SDK:SoftwareDevelopmentKit的缩写,软件开发工具包,包括辅助软件开发的依赖(jar包)、代码示例等,都可以叫做SDK。
新版阿里云代码改变,想要配置认证需要设置环境变量
set OSS_ACCESS_KEY_ID=不知道哦
set OSS_ACCESS_KEY_SECRET=UnInywTMyfehUcKXxS9EXw5oORMNma
这是一个成功上传一张图片的实例
package com.liuxin;
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.FileInputStream;
import java.io.InputStream;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-beijing.aliyuncs.com";
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填写Bucket名称,例如examplebucket。
String bucketName = "web-personalblog";
// 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
String objectName = "1.png";
// 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
// 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
String filePath = "C:\\Users\\Administrator\\Pictures\\ger.png";
// 填写Bucket所在地域。以华东1(杭州)为例,Region填写为cn-hangzhou。
String region = "cn-beijing";
// 创建OSSClient实例。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
InputStream inputStream = new FileInputStream(filePath);
// 创建PutObjectRequest对象。
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
// 创建PutObject请求。
PutObjectResult result = ossClient.putObject(putObjectRequest);
} 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());
} 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());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
实现图片上传
我们的目的是前端上传图片后,将图片接受上传至阿里云OSS服务,拼接阿里云服务器的地址与图片上传时的名字,返回给前端,前端再将返回的图片路径显示在页面上,并且将url和文章表等一起上传至后端。
第一步编写工具类
package com.liuxin.utils;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;
/**
* 阿里云 OSS 工具类
*/
@Component
public class AliOSSUtils {
private String endpoint = "https://oss-cn-beijing.aliyuncs.com";
private String accessKeyId = "LTAI5t9PsdWkShWEb3dU5hWi";
private String accessKeySecret = "UnInywTMyfehUcKXxS9EXw5oORMNma";
private String bucketName = "web-personalblog";
/**
* 实现上传图片到OSS
*/
public String upload(MultipartFile file) throws IOException {
// 获取上传的文件的输入流
InputStream inputStream = file.getInputStream();
// 避免文件覆盖
String originalFilename = file.getOriginalFilename();
String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
//这里是生成uuid,并且截取上传文件名称最后一个点后的字符串(后缀类型)
//上传文件到 OSS 地址,密钥,解析密钥
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
//OSS名字,文件名称,文件内容
ossClient.putObject(bucketName, fileName, inputStream);
//文件访问路径,
String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
// 关闭ossClient
ossClient.shutdown();
return url;// 把上传到oss的路径返回
}
}
第二部分,在接口层实现接口
package com.liuxin.controller;
import com.liuxin.utils.AliOSSUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
@RestController
public class UploadController {
@Autowired
private AliOSSUtils aliOSSUtils;
@PostMapping("/upload")
public String upload(MultipartFile image) throws IOException {
System.out.println(image.getOriginalFilename());
//调用阿里云OSS
String url = aliOSSUtils.upload(image);
System.out.println("文件上传完成{}" + url);
return url;
}
}