• tdesign的文件上传(微信小程序+idea的springboot)


    目录

    1. springboot后端

    1.1 FileController.java

     1.2 listener文件的ErpApplicationListener.java

    1.3  【重点!】FileServiceImpl层

     1.4 IFileService

    1.5 StringUtil通用类

     1.6 主程序加一个监听器

     1.7 oss是什么和怎么创建(application.yml文件)

    2. 微信小程序端

    2.1 TDesign的upload组件

    1. app.json全局引用一下

    2. wxml

    3. js



    1. springboot后端


    具体框架如下所示:

    接下来依次也是Controller层、listener层、service层、util层代码 

    1.1 FileController.java

     如上图可以看到,微信小程序的请求url要传来一个type值,

    controller全部代码如下,直接复制粘贴就行:

    1. package com.huashang.controller;
    2. import com.huashang.common.BaseController;
    3. import com.huashang.service.IFileService;
    4. import org.springframework.web.bind.annotation.*;
    5. import javax.annotation.Resource;
    6. import javax.servlet.http.HttpServletRequest;
    7. import javax.servlet.http.HttpServletResponse;
    8. import java.io.InputStream;
    9. import java.io.OutputStream;
    10. import java.math.BigDecimal;
    11. import java.net.URL;
    12. import java.net.URLConnection;
    13. import java.net.URLEncoder;
    14. @RestController
    15. public class FileController extends BaseController {
    16. @Resource
    17. private IFileService fileService;
    18. @RequestMapping(value = "/files/{type}", method = RequestMethod.POST)
    19. public String uploadFile(@PathVariable String type ,HttpServletRequest request) throws Exception {
    20. return fileService.uploadFiles(request, type);
    21. }
    22. }

     1.2 listener文件的ErpApplicationListener.java

    你的主程序添加监听器

    ErpApplicationListener代码如下:

    实现了

    ApplicationListener接口

    重写了

    onApplicationEvent方法

    1. package com.huashang.listener;
    2. import com.huashang.service.IFileService;
    3. import org.springframework.context.ApplicationListener;
    4. import org.springframework.context.event.ContextRefreshedEvent;
    5. public class ErpApplicationListener implements ApplicationListener {
    6. @Override
    7. public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
    8. IFileService fileService = contextRefreshedEvent.getApplicationContext().getBean(IFileService.class);
    9. fileService.initClient();
    10. }
    11. }

    获取getBean的的IFileService.class

    主要就是监听该类的调用

    1.3  【重点!】FileServiceImpl层

    FileServiceImpl是IFileService的实现类,先看实现类,接口放最后了

    以下代码不要直接复制粘贴到serviceImpl层,是原始代码,需要修改并添加一个引用才能使用

    1. package com.huashang.serviceImpl;
    2. import java.io.FileInputStream;
    3. import java.io.FileNotFoundException;
    4. import java.io.IOException;
    5. import java.time.LocalDate;
    6. import java.util.Arrays;
    7. import java.util.Date;
    8. import java.util.List;
    9. import java.util.Objects;
    10. import java.util.Set;
    11. import javax.servlet.http.HttpServletRequest;
    12. import org.slf4j.Logger;
    13. import org.slf4j.LoggerFactory;
    14. import org.springframework.beans.factory.annotation.Autowired;
    15. import org.springframework.stereotype.Service;
    16. import org.springframework.transaction.annotation.Transactional;
    17. import org.springframework.util.MultiValueMap;
    18. import org.springframework.web.multipart.MultipartFile;
    19. import org.springframework.web.multipart.MultipartHttpServletRequest;
    20. import com.aliyun.oss.ClientException;
    21. import com.aliyun.oss.OSSClient;
    22. import com.aliyun.oss.OSSException;
    23. import com.huashang.common.Constants;
    24. import com.huashang.model.Alioss;
    25. import com.huashang.service.IFileService;
    26. import cn.hutool.core.date.DateUtil;
    27. @Service
    28. public class FileServiceImpl implements IFileService {
    29. private Alioss alioss;
    30. private final static List FILE_TYPE = Arrays.asList("product", "biz", "color", "qa", "mes_qa", "oa", "model");
    31. @Autowired
    32. public void setAlioss(Alioss alioss) {
    33. this.alioss = alioss;
    34. }
    35. public static OSSClient ossClient;
    36. private final static Logger logger = LoggerFactory.getLogger(FileServiceImpl.class);
    37. @Override
    38. public void initClient() {
    39. // 实例化客户端
    40. logger.info("**************************初始化阿里云文件上传服务服务端--START****************************");
    41. ossClient = new OSSClient(alioss.getEndpoint(), alioss.getAccessKeyId(), alioss.getAcceddKeySecret());
    42. logger.info("**************************初始化阿里云文件上传服务服务端--END****************************");
    43. }
    44. @Transactional
    45. @Override
    46. public String uploadFiles(HttpServletRequest request, String type) throws IOException {
    47. String picUrl = "";
    48. if (request instanceof MultipartHttpServletRequest) {
    49. MultiValueMap multiMap = ((MultipartHttpServletRequest) request).getMultiFileMap();
    50. Set keys = multiMap.keySet();
    51. for (String key : keys) {
    52. List mutiFiles = multiMap.get(key);
    53. for (int i = 0; i < mutiFiles.size(); i++) {
    54. if (!FILE_TYPE.contains(type)) {
    55. return "可以上传的文件类型:" + FILE_TYPE.toString();
    56. }
    57. MultipartFile file = mutiFiles.get(i);
    58. String originalFilename = this.getFileOldName(file);
    59. LocalDate now = LocalDate.now();
    60. String dir = type + "/" + now.getYear() + "/" + now.getMonthValue() + "/" + now.getDayOfMonth() + "/";
    61. String path = dir + originalFilename;
    62. try {
    63. ossClient.putObject(alioss.getBucketName(), path, mutiFiles.get(i).getInputStream());
    64. } catch (OSSException | ClientException | IOException e) {
    65. e.printStackTrace();
    66. }
    67. if (mutiFiles.size() - i == 1) {
    68. picUrl += "https://" + alioss.getUrl() + "/" + path;
    69. } else {
    70. picUrl += "https://" + alioss.getUrl() + "/" + path + ",";
    71. }
    72. }
    73. }
    74. }
    75. return picUrl;
    76. }
    77. @Override
    78. public String uploadTmpFile(String filePath, String fileName) throws FileNotFoundException {
    79. StringBuilder dirBuilder = new StringBuilder("tmp/");
    80. dirBuilder.append(DateUtil.format(new Date(), Constants.DATE_yyyyMMdd)).append("/");
    81. StringBuilder fileLinkBuilder = new StringBuilder();
    82. fileLinkBuilder.append("https://").append(alioss.getUrl()).append("/").append(dirBuilder.toString()).append(fileName);
    83. ossClient.putObject(alioss.getBucketName(), dirBuilder.toString() + fileName, new FileInputStream(filePath + fileName));
    84. return fileLinkBuilder.toString();
    85. }
    86. private String getFileOldName(MultipartFile file) {
    87. return Objects.requireNonNull(file.getOriginalFilename()).replaceAll("[^a-zA-Z0-9.]", "^_^");
    88. }
    89. }

    接下来教大家怎么修改文件

     看不清楚没关系,如下图片是你唯一需要修改的地方

    以下代码直接复制粘贴到FileServiceImpl

    1. package com.huashang.serviceImpl;
    2. import java.io.FileInputStream;
    3. import java.io.FileNotFoundException;
    4. import java.io.IOException;
    5. import java.time.LocalDate;
    6. import java.util.Arrays;
    7. import java.util.Date;
    8. import java.util.List;
    9. import java.util.Objects;
    10. import java.util.Set;
    11. import javax.servlet.http.HttpServletRequest;
    12. import com.huashang.util.StringUtil;
    13. import org.slf4j.Logger;
    14. import org.slf4j.LoggerFactory;
    15. import org.springframework.beans.factory.annotation.Autowired;
    16. import org.springframework.stereotype.Service;
    17. import org.springframework.transaction.annotation.Transactional;
    18. import org.springframework.util.MultiValueMap;
    19. import org.springframework.web.multipart.MultipartFile;
    20. import org.springframework.web.multipart.MultipartHttpServletRequest;
    21. import com.aliyun.oss.ClientException;
    22. import com.aliyun.oss.OSSClient;
    23. import com.aliyun.oss.OSSException;
    24. import com.huashang.common.Constants;
    25. import com.huashang.model.Alioss;
    26. import com.huashang.service.IFileService;
    27. import cn.hutool.core.date.DateUtil;
    28. @Service
    29. public class FileServiceImpl implements IFileService {
    30. private Alioss alioss;
    31. private final static List FILE_TYPE = Arrays.asList("product", "biz", "color", "qa", "mes_qa", "oa", "model");
    32. @Autowired
    33. public void setAlioss(Alioss alioss) {
    34. this.alioss = alioss;
    35. }
    36. public static OSSClient ossClient;
    37. private final static Logger logger = LoggerFactory.getLogger(FileServiceImpl.class);
    38. @Override
    39. public void initClient() {
    40. // 实例化客户端
    41. logger.info("**************************初始化阿里云文件上传服务服务端--START****************************");
    42. ossClient = new OSSClient(alioss.getEndpoint(), alioss.getAccessKeyId(), alioss.getAcceddKeySecret());
    43. logger.info("**************************初始化阿里云文件上传服务服务端--END****************************");
    44. }
    45. @Transactional
    46. @Override
    47. public String uploadFiles(HttpServletRequest request, String type) throws IOException {
    48. if(StringUtil.stringBlank(type)){
    49. throw new RuntimeException("type must not be empty");
    50. }
    51. if(!Arrays.asList("user", "house", "project").contains(type)){
    52. throw new RuntimeException("type is not supported");
    53. }
    54. StringBuilder picUrl = new StringBuilder();
    55. if (request instanceof MultipartHttpServletRequest) {
    56. MultiValueMap multiMap = ((MultipartHttpServletRequest) request).getMultiFileMap();
    57. Set keys = multiMap.keySet();
    58. for (String key : keys) {
    59. List mutiFiles = multiMap.get(key);
    60. for (int i = 0; i < mutiFiles.size(); i++) {
    61. String fileOldName = StringUtil.getFileOldName(mutiFiles.get(i));
    62. String fileName = StringUtil.randomString(20) + fileOldName;
    63. String dir = type + "/" + DateUtil.format(new Date(), "yyMMddHH") + "/";
    64. String path = dir + fileName;
    65. try {
    66. ossClient.putObject(alioss.getBucketName(), path, mutiFiles.get(i).getInputStream());
    67. } catch (OSSException | ClientException | IOException e) {
    68. e.printStackTrace();
    69. }
    70. if (mutiFiles.size() - i == 1) {
    71. picUrl.append("https://").append(alioss.getUrl()).append("/").append(path);
    72. } else {
    73. picUrl.append("https://").append(alioss.getUrl()).append("/").append(path).append(",");
    74. }
    75. }
    76. }
    77. }
    78. return picUrl.toString();
    79. }
    80. @Override
    81. public String uploadTmpFile(String filePath, String fileName) throws FileNotFoundException {
    82. StringBuilder dirBuilder = new StringBuilder("tmp/");
    83. dirBuilder.append(DateUtil.format(new Date(), Constants.DATE_yyyyMMdd)).append("/");
    84. StringBuilder fileLinkBuilder = new StringBuilder();
    85. fileLinkBuilder.append("https://").append(alioss.getUrl()).append("/").append(dirBuilder.toString()).append(fileName);
    86. ossClient.putObject(alioss.getBucketName(), dirBuilder.toString() + fileName, new FileInputStream(filePath + fileName));
    87. return fileLinkBuilder.toString();
    88. }
    89. }

     1.4 IFileService


    1. package com.huashang.service;
    2. import java.io.FileNotFoundException;
    3. import java.io.IOException;
    4. import javax.servlet.http.HttpServletRequest;
    5. public interface IFileService {
    6. void initClient();
    7. String uploadFiles(HttpServletRequest request, String type) throws IOException;
    8. String uploadTmpFile(String filePath, String fileName) throws FileNotFoundException;
    9. }

    1.5 StringUtil通用类


    都是定义好的,复制粘贴就行

    1. package com.huashang.util;
    2. import java.math.BigDecimal;
    3. import java.nio.charset.StandardCharsets;
    4. import java.util.ArrayList;
    5. import java.util.Arrays;
    6. import java.util.List;
    7. import java.util.Random;
    8. import java.util.regex.Matcher;
    9. import java.util.regex.Pattern;
    10. import org.springframework.stereotype.Component;
    11. import org.springframework.web.multipart.MultipartFile;
    12. @Component("stringUtil")
    13. public class StringUtil {
    14. private static final String ALL_CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    15. private static final String ALL_NUMBERS = "0123456789";
    16. /**
    17. * 将换行处理为空
    18. *
    19. */
    20. public static String n2Null(String myString) {
    21. if (myString == null) {
    22. return myString;
    23. }
    24. String newString = null;
    25. Pattern CRLF = Pattern.compile("(\r\n|\r|\n|\n\r)");
    26. Matcher m = CRLF.matcher(myString);
    27. if (m.find()) {
    28. newString = m.replaceAll(" ");
    29. } else {
    30. newString = myString;
    31. }
    32. return newString;
    33. }
    34. public static String randomString(int length) {
    35. StringBuffer sb = new StringBuffer();
    36. Random random = new Random();
    37. for (int i = 0; i < length; i++) {
    38. sb.append(ALL_CHARS.charAt(random.nextInt(ALL_CHARS.length())));
    39. }
    40. return sb.toString();
    41. }
    42. public static String randomNumber(int length) {
    43. StringBuffer sb = new StringBuffer();
    44. Random random = new Random();
    45. for (int i = 0; i < length; i++) {
    46. sb.append(ALL_NUMBERS.charAt(random.nextInt(ALL_NUMBERS.length())));
    47. }
    48. return sb.toString();
    49. }
    50. public static boolean stringBlank(String str) {
    51. return str == null || "".equals(str.trim());
    52. }
    53. public static String getFileOldName(MultipartFile file) {
    54. return file.getOriginalFilename().replaceAll("[^a-zA-Z0-9.]", "^_^");
    55. }
    56. public static String humb2UnderLine(String s) {
    57. if (s == null) {
    58. return null;
    59. }
    60. StringBuilder sb = new StringBuilder();
    61. boolean upperCase = false;
    62. for (int i = 0; i < s.length(); i++) {
    63. char c = s.charAt(i);
    64. boolean nextUpperCase = true;
    65. if (i < (s.length() - 1)) {
    66. nextUpperCase = Character.isUpperCase(s.charAt(i + 1));
    67. }
    68. if (Character.isUpperCase(c)) {
    69. if (!upperCase || !nextUpperCase) {
    70. if (i > 0) {
    71. sb.append("_");
    72. }
    73. }
    74. upperCase = true;
    75. } else {
    76. upperCase = false;
    77. }
    78. sb.append(Character.toLowerCase(c));
    79. }
    80. return sb.toString();
    81. }
    82. public static String firstImage(String images) {
    83. List ia = imageArray(images);
    84. return ia.isEmpty() ? null : ia.get(0);
    85. }
    86. public static List imageArray(String images) {
    87. List is = new ArrayList<>();
    88. for (String i : split(images, ";")) {
    89. if (!"".equals(i.trim())) {
    90. is.add(i.trim());
    91. }
    92. }
    93. return is;
    94. }
    95. public static List split(String images, String splitor) {
    96. if (images == null || "".equals(images.trim())) {
    97. return new ArrayList<>();
    98. }
    99. return Arrays.asList(images.split(splitor));
    100. }
    101. public static String nullString(Object obj) {
    102. return obj == null ? "" : obj.toString();
    103. }
    104. /**
    105. * 图片的字符串,将其中的eshangying的连接替换为支持https协议的简赢域名
    106. * http://files.eshangying.com/2015-06-03/ctgge_518h0aZN0DL._UL1500_.jpg;
    107. * esyfiles.lrerp.com
    108. */
    109. public static String dealImageEwin2Jy(String images) {
    110. if (StringUtil.stringBlank(images)) {
    111. return images;
    112. }
    113. images = images.replace("files.eshangying.com", "esyfiles.lrerp.com");
    114. return images;
    115. }
    116. /**
    117. * 将字符串text中由openToken和closeToken组成的占位符依次替换为args数组中的值
    118. *
    119. * @param openToken
    120. * @param closeToken
    121. * @param text
    122. * @param args
    123. * @return
    124. */
    125. public static String parseInner(String openToken, String closeToken, String text, Object... args) {
    126. if (args == null || args.length <= 0) {
    127. return text;
    128. }
    129. int argsIndex = 0;
    130. if (text == null || text.isEmpty()) {
    131. return "";
    132. }
    133. char[] src = text.toCharArray();
    134. int offset = 0;
    135. // search open token
    136. int start = text.indexOf(openToken, offset);
    137. if (start == -1) {
    138. return text;
    139. }
    140. final StringBuilder builder = new StringBuilder();
    141. StringBuilder expression = null;
    142. while (start > -1) {
    143. if (start > 0 && src[start - 1] == '\\') {
    144. // this open token is escaped. remove the backslash and continue.
    145. builder.append(src, offset, start - offset - 1).append(openToken);
    146. offset = start + openToken.length();
    147. } else {
    148. // found open token. let's search close token.
    149. if (expression == null) {
    150. expression = new StringBuilder();
    151. } else {
    152. expression.setLength(0);
    153. }
    154. builder.append(src, offset, start - offset);
    155. offset = start + openToken.length();
    156. int end = text.indexOf(closeToken, offset);
    157. while (end > -1) {
    158. if (end > offset && src[end - 1] == '\\') {
    159. // this close token is escaped. remove the backslash and continue.
    160. expression.append(src, offset, end - offset - 1).append(closeToken);
    161. offset = end + closeToken.length();
    162. end = text.indexOf(closeToken, offset);
    163. } else {
    164. expression.append(src, offset, end - offset);
    165. offset = end + closeToken.length();
    166. break;
    167. }
    168. }
    169. if (end == -1) {
    170. // close token was not found.
    171. builder.append(src, start, src.length - start);
    172. offset = src.length;
    173. } else {
    174. ///仅仅修改了该else分支下的个别行代码
    175. String value = (argsIndex <= args.length - 1) ?
    176. (args[argsIndex] == null ? "" : args[argsIndex].toString()) : expression.toString();
    177. builder.append(value);
    178. offset = end + closeToken.length();
    179. argsIndex++;
    180. }
    181. }
    182. start = text.indexOf(openToken, offset);
    183. }
    184. if (offset < src.length) {
    185. builder.append(src, offset, src.length - offset);
    186. }
    187. return builder.toString();
    188. }
    189. public static String parseWith$(String text, Object... args) {
    190. return parseInner("${", "}", text, args);
    191. }
    192. public static String parse(String text, Object... args) {
    193. return parseInner("{", "}", text, args);
    194. }
    195. /**
    196. * 数组指定位置插入元素
    197. *
    198. * @param after 在数组哪个元素后面 特殊: index0 代表 插入最开始
    199. * @param item 需要插入的元素
    200. * @param arr 操作的数组
    201. * @return 插入后的数组
    202. */
    203. public static String[] arrPushItem(String after, String item, String[] arr) {
    204. ArrayList list = new ArrayList<>(Arrays.asList(arr));
    205. if (after == null) {
    206. list.add(item);
    207. } else if ("index0".equals(after)) {
    208. list.add(0, item);
    209. } else {
    210. int i = list.indexOf(after) + 1;
    211. list.add(i, item);
    212. }
    213. String[] strings = new String[list.size()];
    214. list.toArray(strings);
    215. return strings;
    216. }
    217. /**
    218. * 字符串转换为BigDecimal
    219. *
    220. * @param number
    221. * @return
    222. */
    223. public static BigDecimal string2BigDecimal(String number) {
    224. if (stringBlank(number)) {
    225. return null;
    226. }
    227. return new BigDecimal(number);
    228. }
    229. public static boolean isNumeric(String str) {
    230. if (stringBlank(str)) {
    231. return false;
    232. }
    233. return str.matches("-?[0-9]+.?[0-9]*");
    234. }
    235. /**
    236. * 替换掉html 标签
    237. *
    238. * @param myString
    239. * @return
    240. */
    241. public static String filterHtml(String myString) {
    242. if (myString == null) {
    243. return myString;
    244. }
    245. String newString = myString;
    246. Pattern BREND = Pattern.compile("(
      |
      |
      |
      )"
      , Pattern.CASE_INSENSITIVE);
    247. Matcher me = BREND.matcher(newString);
    248. if (me.find()) {
    249. newString = me.replaceAll("\r\n");
    250. }
    251. Pattern SPANEND = Pattern.compile("(|)", Pattern.CASE_INSENSITIVE);
    252. Matcher se = SPANEND.matcher(newString);
    253. if (se.find()) {
    254. newString = se.replaceAll(" ");
    255. }
    256. // 过滤html标签
    257. Pattern pHtml = Pattern.compile("<[^>]+>", Pattern.CASE_INSENSITIVE);
    258. Matcher mHtml = pHtml.matcher(newString);
    259. if (mHtml.find()) {
    260. newString = mHtml.replaceAll("");
    261. }
    262. return newString;
    263. }
    264. public static String firstToLowerCase(String str) {
    265. if (stringBlank(str)) {
    266. return str;
    267. }
    268. return str.replaceFirst(String.valueOf(str.charAt(0)), String.valueOf(str.charAt(0)).toLowerCase());
    269. }
    270. public static List stringArr2List(String[] stringArr) {
    271. List resultList = new ArrayList<>();
    272. if (stringArr == null) {
    273. return resultList;
    274. }
    275. for (String string : stringArr) {
    276. if (StringUtil.stringBlank(string)) {
    277. continue;
    278. }
    279. resultList.add(string);
    280. }
    281. return resultList;
    282. }
    283. public static byte[] s2BytesUTF8(String str) {
    284. if (stringBlank(str)) {
    285. return null;
    286. }
    287. return str.getBytes(StandardCharsets.UTF_8);
    288. }
    289. /**
    290. * 解码
    291. * 编码字符串 --> 文本字符串
    292. * 支持对 ASCII与UNICODE混合编码的(脏文本)字符串解码
    293. * Eg : "\"2ABRT3425\\u884C\\u653F\\u590D\\u8BAE\\u8868436FDGDSD\"" --> 2ABRT3425行政复议表
    294. *
    295. * @param unicode
    296. * @return
    297. */
    298. public static String unicodetoString(String unicode) {
    299. if (unicode == null || "".equals(unicode)) {
    300. return null;
    301. }
    302. StringBuilder sb = new StringBuilder();
    303. for (int pos = 0; pos < unicode.length(); ) {
    304. //"\"2ABRT3425\\u884C\\u653F\\u590D\\u8BAE\\u8868436FDGDSD\"";
    305. //System.out.println("pos:"+unicode.substring(pos,pos+1)+" - "+pos);
    306. //System.out.println("index:"+unicode.indexOf("\\u", pos)+"\n");
    307. if (unicode.indexOf("\\u", pos) - pos == 0) {//unicode编码 Eg: \\2435
    308. //System.out.println("pos2:"+unicode.substring(pos,pos+6));
    309. if (pos + 6 <= unicode.length()) {
    310. Character ch = (char) Integer.parseInt(unicode.substring(pos + 2, pos + 6), 16);
    311. //System.out.println("char:"+ch);
    312. sb.append(ch);
    313. pos += 6;
    314. } else {// \\u
    315. sb.append(unicode, pos, pos + 2);
    316. pos += 2;
    317. }
    318. } else {//非unicode编码
    319. sb.append(unicode.charAt(pos));
    320. pos += 1;
    321. }
    322. }
    323. return sb.toString();
    324. }
    325. public static boolean integerBlank(Integer integer) {
    326. return integer == null || integer <= 0;
    327. }
    328. }

     1.6 主程序加一个监听器

    1. package com.huashang;
    2. import com.huashang.listener.ErpApplicationListener;
    3. import org.mybatis.spring.annotation.MapperScan;
    4. import org.springframework.boot.SpringApplication;
    5. import org.springframework.boot.autoconfigure.SpringBootApplication;
    6. import org.springframework.context.annotation.ComponentScan;
    7. import org.springframework.context.annotation.EnableAspectJAutoProxy;
    8. import org.springframework.scheduling.annotation.EnableAsync;
    9. import org.springframework.scheduling.annotation.EnableScheduling;
    10. import org.springframework.transaction.annotation.EnableTransactionManagement;
    11. @SpringBootApplication
    12. @EnableAsync
    13. @EnableScheduling
    14. @EnableTransactionManagement
    15. @EnableAspectJAutoProxy(proxyTargetClass = true)
    16. @MapperScan("com.huashang.mapper")
    17. @ComponentScan("com.huashang")
    18. public class ErpApplication {
    19. public static void main(String[] args) {
    20. SpringApplication springApplication = new SpringApplication(ErpApplication.class);
    21. // 添加监听器,执行需要在服务启动时执行的业务逻辑
    22. springApplication.addListeners(new ErpApplicationListener());
    23. springApplication.run(args);
    24. }
    25. }

     1.7 oss是什么和怎么创建(application.yml文件)


    只需要修改一下这里就行,是你oss的配置,我这里是阿里的oss

     oss是什么和怎么创建看视频就行:

    如何使用OSS控制台、ossutil、ossbrowser、OSSSDK_对象存储 OSS-阿里云帮助中心 (aliyun.com)

    创建好了以后,对

    以上2个文件都进行以下修改

    1. spring:
    2. datasource:
    3. driver-class-name: com.mysql.cj.jdbc.Driver
    4. username: 'lrerp'
    5. password: 'By*****23'
    6. url: jdbc:mysql://pc-uf6fv9vxz81ws1y53.rwlb.rds.aliyuncs.com:3306/lingrong?useUnicode=yes&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai
    7. servlet:
    8. multipart:
    9. enabled: true
    10. max-file-size: 10MB
    11. max-request-size: 20MB
    12. aop:
    13. auto: true
    14. cross:
    15. origin: 'lrerp.com'
    16. audience:
    17. clientId: cbde72f64*****************00d3b
    18. base64Secret: ZWExZjcxNzFi*********E2NGUwZTEzZjgxYmRkMzU=
    19. name: restapiuser
    20. expiresSecond: 172800000
    21. liteflow:
    22. print-banner: false
    23. rule-source-ext-data-map:
    24. driverClassName: com.mysql.cj.jdbc.Driver
    25. username: 'lrerp'
    26. password: '******3'
    27. url: jdbc:mysql://pc-uf6fv9vxz81ws1y53.rwlb.rds.aliyuncs.com:3306/lingrong?useUnicode=yes&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai
    28. applicationName: lingrong
    29. chainTableName: chain
    30. chainApplicationNameField: application_name
    31. chainNameField: chain_name
    32. elDataField: el_data
    33. alioss:
    34. url: file.lrerp.com
    35. endpoint: http://oss-cn-shanghai.aliyuncs.com
    36. accessKeyId: LT#****************PPM
    37. acceddKeySecret: UVg***************C6L
    38. bucketName: lrerp

    2. 微信小程序端


    2.1 TDesign的upload组件


    TDesign的upload组件 (tencent.com)icon-default.png?t=N7T8https://tdesign.tencent.com/miniprogram/components/upload

    1. app.json全局引用一下

    2. wxml

    如图可以看到mediaType中我只保留了模版中的image,bind:add事件我定义了一个handleCertificateAdd(),用于上传我的房屋产权图片,max修改为0,可以上传任意个图片

    3. js

    js页面主要修改了

    1. data的数据:

    定义一个数组 `certificateList:[ ]`就行

    2. 【重点!】uploadFile(file,updateProgress,updateSuccess)方法

     token

    这个token就是数据库中的token的值 

    3. handleCertificateAdd()方法

     遍历上传的所有图片,通过调用上面的uploadFile方法

    下面来分析这几个红框中的代码

    1. 

    1. this.setData({
    2. certificateList: [...(this.data.certificateList), {
    3. ...file,
    4. status: 'loading'
    5. }],
    6. });

    2.  

    每个file都遍历调用uploadFile(file,updateProgress,updateSuccess)方法实现上传,

    把方法体作为参数,回调,

    方框中的方法,是uploadFile(file,updateProgress,updateSuccess)中的updateProgress参数

    可以看到task的返回值参数res.progress为100

    3.  

    1. (ue) => {
    2. console.log('certificateList:' + ue)
    3. this.setData({
    4. [`certificateList[${length}].status`]: 'done',
    5. [`certificateList[${length}].remoteUrl`]: ue.data
    6. });
    7. }

    如下图 方框中的方法,就是作为uploadFile(file,updateProgress,updateSuccess)中的updateSuccess参数

    [`certificateList[${length}].status`]: 'done'

    就是把图片的status属性设置为done,图片显示出来不会一直转圈

  • 相关阅读:
    vscode 代码片段
    Java设置JSON字符串参数编码
    Android 错把setLayerType当成硬件加速
    基于SpringBoot的线上买菜系统
    Vue中的事件监听
    Elasticsearch:与多个 PDF 聊天 | LangChain Python 应用教程(免费 LLMs 和嵌入)
    springboot实现同时批量新增和批量修改数据
    LeetCode //C - 112. Path Sum
    c# 把 json 字符串解析成 json 对象(小例子)
    作为微软开发者官方号,我们又要做点特别的事情了
  • 原文地址:https://blog.csdn.net/m0_47010003/article/details/132991423