tdesign的文件上傳功能實(shí)現(xiàn)(微信小程序+idea的springboot)
1. springboot后端

1.1 FileController.java

如上圖可以看到,微信小程序的請(qǐng)求url要傳來一個(gè)type值,
controller全部代碼如下,直接復(fù)制粘貼就行:
package com.huashang.controller;
import com.huashang.common.BaseController;
import com.huashang.service.IFileService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
@RestController
public class FileController extends BaseController {
@Resource
private IFileService fileService;
@RequestMapping(value = "/files/{type}", method = RequestMethod.POST)
public String uploadFile(@PathVariable String type ,HttpServletRequest request) throws Exception {
return fileService.uploadFiles(request, type);
}
}1.2 listener文件的ErpApplicationListener.java

1.3 【重點(diǎn)!】FileServiceImpl層
package com.huashang.serviceImpl;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.MultiValueMap;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.huashang.common.Constants;
import com.huashang.model.Alioss;
import com.huashang.service.IFileService;
import cn.hutool.core.date.DateUtil;
@Service
public class FileServiceImpl implements IFileService {
private Alioss alioss;
private final static List<String> FILE_TYPE = Arrays.asList("product", "biz", "color", "qa", "mes_qa", "oa", "model");
@Autowired
public void setAlioss(Alioss alioss) {
this.alioss = alioss;
}
public static OSSClient ossClient;
private final static Logger logger = LoggerFactory.getLogger(FileServiceImpl.class);
@Override
public void initClient() {
// 實(shí)例化客戶端
logger.info("**************************初始化阿里云文件上傳服務(wù)服務(wù)端--START****************************");
ossClient = new OSSClient(alioss.getEndpoint(), alioss.getAccessKeyId(), alioss.getAcceddKeySecret());
logger.info("**************************初始化阿里云文件上傳服務(wù)服務(wù)端--END****************************");
}
@Transactional
@Override
public String uploadFiles(HttpServletRequest request, String type) throws IOException {
String picUrl = "";
if (request instanceof MultipartHttpServletRequest) {
MultiValueMap<String, MultipartFile> multiMap = ((MultipartHttpServletRequest) request).getMultiFileMap();
Set<String> keys = multiMap.keySet();
for (String key : keys) {
List<MultipartFile> mutiFiles = multiMap.get(key);
for (int i = 0; i < mutiFiles.size(); i++) {
if (!FILE_TYPE.contains(type)) {
return "可以上傳的文件類型:" + FILE_TYPE.toString();
}
MultipartFile file = mutiFiles.get(i);
String originalFilename = this.getFileOldName(file);
LocalDate now = LocalDate.now();
String dir = type + "/" + now.getYear() + "/" + now.getMonthValue() + "/" + now.getDayOfMonth() + "/";
String path = dir + originalFilename;
try {
ossClient.putObject(alioss.getBucketName(), path, mutiFiles.get(i).getInputStream());
} catch (OSSException | ClientException | IOException e) {
e.printStackTrace();
}
if (mutiFiles.size() - i == 1) {
picUrl += "https://" + alioss.getUrl() + "/" + path;
} else {
picUrl += "https://" + alioss.getUrl() + "/" + path + ",";
}
}
}
}
return picUrl;
}
@Override
public String uploadTmpFile(String filePath, String fileName) throws FileNotFoundException {
StringBuilder dirBuilder = new StringBuilder("tmp/");
dirBuilder.append(DateUtil.format(new Date(), Constants.DATE_yyyyMMdd)).append("/");
StringBuilder fileLinkBuilder = new StringBuilder();
fileLinkBuilder.append("https://").append(alioss.getUrl()).append("/").append(dirBuilder.toString()).append(fileName);
ossClient.putObject(alioss.getBucketName(), dirBuilder.toString() + fileName, new FileInputStream(filePath + fileName));
return fileLinkBuilder.toString();
}
private String getFileOldName(MultipartFile file) {
return Objects.requireNonNull(file.getOriginalFilename()).replaceAll("[^a-zA-Z0-9.]", "^_^");
}
}以下代碼不要直接復(fù)制粘貼到serviceImpl層,是原始代碼,需要修改并添加一個(gè)引用才能使用
package com.huashang.serviceImpl;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import com.huashang.util.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.MultiValueMap;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.huashang.common.Constants;
import com.huashang.model.Alioss;
import com.huashang.service.IFileService;
import cn.hutool.core.date.DateUtil;
@Service
public class FileServiceImpl implements IFileService {
private Alioss alioss;
private final static List<String> FILE_TYPE = Arrays.asList("product", "biz", "color", "qa", "mes_qa", "oa", "model");
@Autowired
public void setAlioss(Alioss alioss) {
this.alioss = alioss;
}
public static OSSClient ossClient;
private final static Logger logger = LoggerFactory.getLogger(FileServiceImpl.class);
@Override
public void initClient() {
// 實(shí)例化客戶端
logger.info("**************************初始化阿里云文件上傳服務(wù)服務(wù)端--START****************************");
ossClient = new OSSClient(alioss.getEndpoint(), alioss.getAccessKeyId(), alioss.getAcceddKeySecret());
logger.info("**************************初始化阿里云文件上傳服務(wù)服務(wù)端--END****************************");
}
@Transactional
@Override
public String uploadFiles(HttpServletRequest request, String type) throws IOException {
if(StringUtil.stringBlank(type)){
throw new RuntimeException("type must not be empty");
}
if(!Arrays.asList("user", "house", "project").contains(type)){
throw new RuntimeException("type is not supported");
}
StringBuilder picUrl = new StringBuilder();
if (request instanceof MultipartHttpServletRequest) {
MultiValueMap<String, MultipartFile> multiMap = ((MultipartHttpServletRequest) request).getMultiFileMap();
Set<String> keys = multiMap.keySet();
for (String key : keys) {
List<MultipartFile> mutiFiles = multiMap.get(key);
for (int i = 0; i < mutiFiles.size(); i++) {
String fileOldName = StringUtil.getFileOldName(mutiFiles.get(i));
String fileName = StringUtil.randomString(20) + fileOldName;
String dir = type + "/" + DateUtil.format(new Date(), "yyMMddHH") + "/";
String path = dir + fileName;
try {
ossClient.putObject(alioss.getBucketName(), path, mutiFiles.get(i).getInputStream());
} catch (OSSException | ClientException | IOException e) {
e.printStackTrace();
}
if (mutiFiles.size() - i == 1) {
picUrl.append("https://").append(alioss.getUrl()).append("/").append(path);
} else {
picUrl.append("https://").append(alioss.getUrl()).append("/").append(path).append(",");
}
}
}
}
return picUrl.toString();
}
@Override
public String uploadTmpFile(String filePath, String fileName) throws FileNotFoundException {
StringBuilder dirBuilder = new StringBuilder("tmp/");
dirBuilder.append(DateUtil.format(new Date(), Constants.DATE_yyyyMMdd)).append("/");
StringBuilder fileLinkBuilder = new StringBuilder();
fileLinkBuilder.append("https://").append(alioss.getUrl()).append("/").append(dirBuilder.toString()).append(fileName);
ossClient.putObject(alioss.getBucketName(), dirBuilder.toString() + fileName, new FileInputStream(filePath + fileName));
return fileLinkBuilder.toString();
}
}接下來教大家怎么修改文件

看不清楚沒關(guān)系,如下圖片是你唯一需要修改的地方

以下代碼直接復(fù)制粘貼到FileServiceImpl
package com.huashang.serviceImpl;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import com.huashang.util.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.MultiValueMap;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.huashang.common.Constants;
import com.huashang.model.Alioss;
import com.huashang.service.IFileService;
import cn.hutool.core.date.DateUtil;
@Service
public class FileServiceImpl implements IFileService {
private Alioss alioss;
private final static List<String> FILE_TYPE = Arrays.asList("product", "biz", "color", "qa", "mes_qa", "oa", "model");
@Autowired
public void setAlioss(Alioss alioss) {
this.alioss = alioss;
}
public static OSSClient ossClient;
private final static Logger logger = LoggerFactory.getLogger(FileServiceImpl.class);
@Override
public void initClient() {
// 實(shí)例化客戶端
logger.info("**************************初始化阿里云文件上傳服務(wù)服務(wù)端--START****************************");
ossClient = new OSSClient(alioss.getEndpoint(), alioss.getAccessKeyId(), alioss.getAcceddKeySecret());
logger.info("**************************初始化阿里云文件上傳服務(wù)服務(wù)端--END****************************");
}
@Transactional
@Override
public String uploadFiles(HttpServletRequest request, String type) throws IOException {
if(StringUtil.stringBlank(type)){
throw new RuntimeException("type must not be empty");
}
if(!Arrays.asList("user", "house", "project").contains(type)){
throw new RuntimeException("type is not supported");
}
StringBuilder picUrl = new StringBuilder();
if (request instanceof MultipartHttpServletRequest) {
MultiValueMap<String, MultipartFile> multiMap = ((MultipartHttpServletRequest) request).getMultiFileMap();
Set<String> keys = multiMap.keySet();
for (String key : keys) {
List<MultipartFile> mutiFiles = multiMap.get(key);
for (int i = 0; i < mutiFiles.size(); i++) {
String fileOldName = StringUtil.getFileOldName(mutiFiles.get(i));
String fileName = StringUtil.randomString(20) + fileOldName;
String dir = type + "/" + DateUtil.format(new Date(), "yyMMddHH") + "/";
String path = dir + fileName;
try {
ossClient.putObject(alioss.getBucketName(), path, mutiFiles.get(i).getInputStream());
} catch (OSSException | ClientException | IOException e) {
e.printStackTrace();
}
if (mutiFiles.size() - i == 1) {
picUrl.append("https://").append(alioss.getUrl()).append("/").append(path);
} else {
picUrl.append("https://").append(alioss.getUrl()).append("/").append(path).append(",");
}
}
}
}
return picUrl.toString();
}
@Override
public String uploadTmpFile(String filePath, String fileName) throws FileNotFoundException {
StringBuilder dirBuilder = new StringBuilder("tmp/");
dirBuilder.append(DateUtil.format(new Date(), Constants.DATE_yyyyMMdd)).append("/");
StringBuilder fileLinkBuilder = new StringBuilder();
fileLinkBuilder.append("https://").append(alioss.getUrl()).append("/").append(dirBuilder.toString()).append(fileName);
ossClient.putObject(alioss.getBucketName(), dirBuilder.toString() + fileName, new FileInputStream(filePath + fileName));
return fileLinkBuilder.toString();
}
}1.4 IFileService
package com.huashang.service;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
public interface IFileService {
void initClient();
String uploadFiles(HttpServletRequest request, String type) throws IOException;
String uploadTmpFile(String filePath, String fileName) throws FileNotFoundException;
}1.5 StringUtil通用類
都是定義好的,復(fù)制粘貼就行
package com.huashang.util;
import java.math.BigDecimal;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
@Component("stringUtil")
public class StringUtil {
private static final String ALL_CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final String ALL_NUMBERS = "0123456789";
/**
* 將換行處理為空
*
*/
public static String n2Null(String myString) {
if (myString == null) {
return myString;
}
String newString = null;
Pattern CRLF = Pattern.compile("(\r\n|\r|\n|\n\r)");
Matcher m = CRLF.matcher(myString);
if (m.find()) {
newString = m.replaceAll(" ");
} else {
newString = myString;
}
return newString;
}
public static String randomString(int length) {
StringBuffer sb = new StringBuffer();
Random random = new Random();
for (int i = 0; i < length; i++) {
sb.append(ALL_CHARS.charAt(random.nextInt(ALL_CHARS.length())));
}
return sb.toString();
}
public static String randomNumber(int length) {
StringBuffer sb = new StringBuffer();
Random random = new Random();
for (int i = 0; i < length; i++) {
sb.append(ALL_NUMBERS.charAt(random.nextInt(ALL_NUMBERS.length())));
}
return sb.toString();
}
public static boolean stringBlank(String str) {
return str == null || "".equals(str.trim());
}
public static String getFileOldName(MultipartFile file) {
return file.getOriginalFilename().replaceAll("[^a-zA-Z0-9.]", "^_^");
}
public static String humb2UnderLine(String s) {
if (s == null) {
return null;
}
StringBuilder sb = new StringBuilder();
boolean upperCase = false;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
boolean nextUpperCase = true;
if (i < (s.length() - 1)) {
nextUpperCase = Character.isUpperCase(s.charAt(i + 1));
}
if (Character.isUpperCase(c)) {
if (!upperCase || !nextUpperCase) {
if (i > 0) {
sb.append("_");
}
}
upperCase = true;
} else {
upperCase = false;
}
sb.append(Character.toLowerCase(c));
}
return sb.toString();
}
public static String firstImage(String images) {
List<String> ia = imageArray(images);
return ia.isEmpty() ? null : ia.get(0);
}
public static List<String> imageArray(String images) {
List<String> is = new ArrayList<>();
for (String i : split(images, ";")) {
if (!"".equals(i.trim())) {
is.add(i.trim());
}
}
return is;
}
public static List<String> split(String images, String splitor) {
if (images == null || "".equals(images.trim())) {
return new ArrayList<>();
}
return Arrays.asList(images.split(splitor));
}
public static String nullString(Object obj) {
return obj == null ? "" : obj.toString();
}
/**
* 圖片的字符串,將其中的eshangying的連接替換為支持https協(xié)議的簡贏域名
* http://files.eshangying.com/2015-06-03/ctgge_518h0aZN0DL._UL1500_.jpg;
* esyfiles.lrerp.com
*/
public static String dealImageEwin2Jy(String images) {
if (StringUtil.stringBlank(images)) {
return images;
}
images = images.replace("files.eshangying.com", "esyfiles.lrerp.com");
return images;
}
/**
* 將字符串text中由openToken和closeToken組成的占位符依次替換為args數(shù)組中的值
*
* @param openToken
* @param closeToken
* @param text
* @param args
* @return
*/
public static String parseInner(String openToken, String closeToken, String text, Object... args) {
if (args == null || args.length <= 0) {
return text;
}
int argsIndex = 0;
if (text == null || text.isEmpty()) {
return "";
}
char[] src = text.toCharArray();
int offset = 0;
// search open token
int start = text.indexOf(openToken, offset);
if (start == -1) {
return text;
}
final StringBuilder builder = new StringBuilder();
StringBuilder expression = null;
while (start > -1) {
if (start > 0 && src[start - 1] == '\\') {
// this open token is escaped. remove the backslash and continue.
builder.append(src, offset, start - offset - 1).append(openToken);
offset = start + openToken.length();
} else {
// found open token. let's search close token.
if (expression == null) {
expression = new StringBuilder();
} else {
expression.setLength(0);
}
builder.append(src, offset, start - offset);
offset = start + openToken.length();
int end = text.indexOf(closeToken, offset);
while (end > -1) {
if (end > offset && src[end - 1] == '\\') {
// this close token is escaped. remove the backslash and continue.
expression.append(src, offset, end - offset - 1).append(closeToken);
offset = end + closeToken.length();
end = text.indexOf(closeToken, offset);
} else {
expression.append(src, offset, end - offset);
offset = end + closeToken.length();
break;
}
}
if (end == -1) {
// close token was not found.
builder.append(src, start, src.length - start);
offset = src.length;
} else {
///僅僅修改了該else分支下的個(gè)別行代碼
String value = (argsIndex <= args.length - 1) ?
(args[argsIndex] == null ? "" : args[argsIndex].toString()) : expression.toString();
builder.append(value);
offset = end + closeToken.length();
argsIndex++;
}
}
start = text.indexOf(openToken, offset);
}
if (offset < src.length) {
builder.append(src, offset, src.length - offset);
}
return builder.toString();
}
public static String parseWith$(String text, Object... args) {
return parseInner("${", "}", text, args);
}
public static String parse(String text, Object... args) {
return parseInner("{", "}", text, args);
}
/**
* 數(shù)組指定位置插入元素
*
* @param after 在數(shù)組哪個(gè)元素后面 特殊: index0 代表 插入最開始
* @param item 需要插入的元素
* @param arr 操作的數(shù)組
* @return 插入后的數(shù)組
*/
public static String[] arrPushItem(String after, String item, String[] arr) {
ArrayList<String> list = new ArrayList<>(Arrays.asList(arr));
if (after == null) {
list.add(item);
} else if ("index0".equals(after)) {
list.add(0, item);
} else {
int i = list.indexOf(after) + 1;
list.add(i, item);
}
String[] strings = new String[list.size()];
list.toArray(strings);
return strings;
}
/**
* 字符串轉(zhuǎn)換為BigDecimal
*
* @param number
* @return
*/
public static BigDecimal string2BigDecimal(String number) {
if (stringBlank(number)) {
return null;
}
return new BigDecimal(number);
}
public static boolean isNumeric(String str) {
if (stringBlank(str)) {
return false;
}
return str.matches("-?[0-9]+.?[0-9]*");
}
/**
* 替換掉html 標(biāo)簽
*
* @param myString
* @return
*/
public static String filterHtml(String myString) {
if (myString == null) {
return myString;
}
String newString = myString;
Pattern BREND = Pattern.compile("(<br/>|<br />|<br>|<br >)", Pattern.CASE_INSENSITIVE);
Matcher me = BREND.matcher(newString);
if (me.find()) {
newString = me.replaceAll("\r\n");
}
Pattern SPANEND = Pattern.compile("(<span/>|<span />)", Pattern.CASE_INSENSITIVE);
Matcher se = SPANEND.matcher(newString);
if (se.find()) {
newString = se.replaceAll(" ");
}
// 過濾html標(biāo)簽
Pattern pHtml = Pattern.compile("<[^>]+>", Pattern.CASE_INSENSITIVE);
Matcher mHtml = pHtml.matcher(newString);
if (mHtml.find()) {
newString = mHtml.replaceAll("");
}
return newString;
}
public static String firstToLowerCase(String str) {
if (stringBlank(str)) {
return str;
}
return str.replaceFirst(String.valueOf(str.charAt(0)), String.valueOf(str.charAt(0)).toLowerCase());
}
public static List<String> stringArr2List(String[] stringArr) {
List<String> resultList = new ArrayList<>();
if (stringArr == null) {
return resultList;
}
for (String string : stringArr) {
if (StringUtil.stringBlank(string)) {
continue;
}
resultList.add(string);
}
return resultList;
}
public static byte[] s2BytesUTF8(String str) {
if (stringBlank(str)) {
return null;
}
return str.getBytes(StandardCharsets.UTF_8);
}
/**
* 解碼
* 編碼字符串 --> 文本字符串
* 支持對(duì) ASCII與UNICODE混合編碼的(臟文本)字符串解碼
* Eg : "\"2ABRT3425\\u884C\\u653F\\u590D\\u8BAE\\u8868436FDGDSD\"" --> 2ABRT3425行政復(fù)議表
*
* @param unicode
* @return
*/
public static String unicodetoString(String unicode) {
if (unicode == null || "".equals(unicode)) {
return null;
}
StringBuilder sb = new StringBuilder();
for (int pos = 0; pos < unicode.length(); ) {
//"\"2ABRT3425\\u884C\\u653F\\u590D\\u8BAE\\u8868436FDGDSD\"";
//System.out.println("pos:"+unicode.substring(pos,pos+1)+" - "+pos);
//System.out.println("index:"+unicode.indexOf("\\u", pos)+"\n");
if (unicode.indexOf("\\u", pos) - pos == 0) {//unicode編碼 Eg: \\2435
//System.out.println("pos2:"+unicode.substring(pos,pos+6));
if (pos + 6 <= unicode.length()) {
Character ch = (char) Integer.parseInt(unicode.substring(pos + 2, pos + 6), 16);
//System.out.println("char:"+ch);
sb.append(ch);
pos += 6;
} else {// \\u
sb.append(unicode, pos, pos + 2);
pos += 2;
}
} else {//非unicode編碼
sb.append(unicode.charAt(pos));
pos += 1;
}
}
return sb.toString();
}
public static boolean integerBlank(Integer integer) {
return integer == null || integer <= 0;
}
}1.6 主程序加一個(gè)監(jiān)聽器

package com.huashang;
import com.huashang.listener.ErpApplicationListener;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@SpringBootApplication
@EnableAsync
@EnableScheduling
@EnableTransactionManagement
@EnableAspectJAutoProxy(proxyTargetClass = true)
@MapperScan("com.huashang.mapper")
@ComponentScan("com.huashang")
public class ErpApplication {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(ErpApplication.class);
// 添加監(jiān)聽器,執(zhí)行需要在服務(wù)啟動(dòng)時(shí)執(zhí)行的業(yè)務(wù)邏輯
springApplication.addListeners(new ErpApplicationListener());
springApplication.run(args);
}
}1.7 application.yml文件
只需要修改一下這里就行,是你oss的配置,我這里是阿里的oss
oss是什么和怎么創(chuàng)建看視頻就行:
如何使用OSS控制臺(tái)、ossutil、ossbrowser、OSSSDK_對(duì)象存儲(chǔ) OSS-阿里云幫助中心 (aliyun.com)
創(chuàng)建好了以后,對(duì)

以上2個(gè)文件都進(jìn)行以下修改

spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: 'lrerp'
password: 'By*****23'
url: jdbc:mysql://pc-uf6fv9vxz81ws1y53.rwlb.rds.aliyuncs.com:3306/lingrong?useUnicode=yes&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai
servlet:
multipart:
enabled: true
max-file-size: 10MB
max-request-size: 20MB
aop:
auto: true
cross:
origin: 'lrerp.com'
audience:
clientId: cbde72f64*****************00d3b
base64Secret: ZWExZjcxNzFi*********E2NGUwZTEzZjgxYmRkMzU=
name: restapiuser
expiresSecond: 172800000
liteflow:
print-banner: false
rule-source-ext-data-map:
driverClassName: com.mysql.cj.jdbc.Driver
username: 'lrerp'
password: '******3'
url: jdbc:mysql://pc-uf6fv9vxz81ws1y53.rwlb.rds.aliyuncs.com:3306/lingrong?useUnicode=yes&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai
applicationName: lingrong
chainTableName: chain
chainApplicationNameField: application_name
chainNameField: chain_name
elDataField: el_data
alioss:
url: file.lrerp.com
endpoint: http://oss-cn-shanghai.aliyuncs.com
accessKeyId: LT#****************PPM
acceddKeySecret: UVg***************C6L
bucketName: lrerp2. 微信小程序端
2.1 TDesign的upload組件
TDesign的upload組件 (tencent.com)
https://tdesign.tencent.com/miniprogram/components/upload

1. app.json全局引用一下

2. wxml

如圖可以看到mediaType中我只保留了模版中的image,bind:add事件我定義了一個(gè)handleCertificateAdd(),用于上傳我的房屋產(chǎn)權(quán)圖片,max修改為0,可以上傳任意個(gè)圖片
3. js

js頁面主要修改了
1. data的數(shù)據(jù):

定義一個(gè)數(shù)組 `certificateList:[ ]`就行
2. 【重點(diǎn)!】uploadFile(file,updateProgress,updateSuccess)方法


token

這個(gè)token就是數(shù)據(jù)庫中的token的值

3. handleCertificateAdd()方法

遍歷上傳的所有圖片,通過調(diào)用上面的uploadFile方法

下面來分析這幾個(gè)紅框中的代碼
1.
this.setData({
certificateList: [...(this.data.certificateList), {
...file,
status: 'loading'
}],
});
2.
每個(gè)file都遍歷調(diào)用uploadFile(file,updateProgress,updateSuccess)方法實(shí)現(xiàn)上傳,
把方法體作為參數(shù),回調(diào),
方框中的方法,是uploadFile(file,updateProgress,updateSuccess)中的updateProgress參數(shù)


可以看到task的返回值參數(shù)res.progress為100
3.
(ue) => {
console.log('certificateList:' + ue)
this.setData({
[`certificateList[${length}].status`]: 'done',
[`certificateList[${length}].remoteUrl`]: ue.data
});
}如下圖 方框中的方法,就是作為uploadFile(file,updateProgress,updateSuccess)中的updateSuccess參數(shù)

[`certificateList[${length}].status`]: 'done'就是把圖片的status屬性設(shè)置為done,圖片顯示出來不會(huì)一直轉(zhuǎn)圈
到此這篇關(guān)于tdesign的文件上傳(微信小程序+idea的springboot)的文章就介紹到這了,更多相關(guān)微信小程序文件上傳內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java并發(fā)系列之JUC中的Lock鎖與synchronized同步代碼塊問題
這篇文章主要介紹了Java并發(fā)系列之JUC中的Lock鎖與synchronized同步代碼塊,簡單介紹了lock鎖及鎖的底層知識(shí),結(jié)合案例給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04
Spring Security6配置方法(廢棄WebSecurityConfigurerAdapter)
本文主要介紹了Spring Security6配置方法(廢棄WebSecurityConfigurerAdapter),就像文章標(biāo)題所說的,SpringSecurity已經(jīng)廢棄了繼承WebSecurityConfigurerAdapter的配置方式,下面就來詳細(xì)的介紹一下,感興趣的可以了解一下2023-12-12
AndroidQ沙盒機(jī)制之分區(qū)存儲(chǔ)適配
這篇文章主要介紹了AndroidQ沙盒機(jī)制之分區(qū)存儲(chǔ)適配,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Java中ArrayIndexOutOfBoundsException 異常報(bào)錯(cuò)的解決方案
本文主要介紹了Java中ArrayIndexOutOfBoundsException 異常報(bào)錯(cuò)的解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
springboot實(shí)現(xiàn)發(fā)送郵件(QQ郵箱為例)
這篇文章主要為大家詳細(xì)介紹了springboot實(shí)現(xiàn)發(fā)送郵件,qq郵箱代碼實(shí)現(xiàn)郵件發(fā)送,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06
eclipse+myeclipse 環(huán)境配置方法
eclipse+myeclipse配置環(huán)境2009-07-07
SpringBoot整合RabbitMQ實(shí)現(xiàn)RPC遠(yuǎn)程調(diào)用功能
在分布式系統(tǒng)中,RPC(Remote?Procedure?Call)是一種常用的通信機(jī)制,它可以讓不同的節(jié)點(diǎn)之間像調(diào)用本地函數(shù)一樣進(jìn)行函數(shù)調(diào)用,隱藏了底層的網(wǎng)絡(luò)通信細(xì)節(jié),通過本教程,你可以了解RPC的基本原理以及如何使用Java實(shí)現(xiàn)一個(gè)簡單的RPC客戶端和服務(wù)端2023-06-06
springboot如何獲取yaml/yml(或properties)配置文件信息
在SpringBoot項(xiàng)目中,讀取配置文件信息是常見需求,可以通過@Autowired注入Environment類,使用@Value注解直接注入配置信息,或定義工具類結(jié)合ApplicationRunner進(jìn)行高級(jí)配置信息獲取,特別提到2024-11-11

