• ue 富文本框WangEditor上传图片到七牛云,富文本框存储图片地址


    思路 可以直接通过前端上传到七牛云,网络上的方法没有调试成功.所以我采用的思路是

    前端上传图片到=>后端服务器=>七牛云=>返回前端图片地址

    1.前端WangEditor控件的配置如下

    this.editor.customConfig.uploadImgShowBase64 = false // base 64 存储图片
          this.editor.customConfig.uploadImgServer = this.$http.BASE_URL + '/api/file/webupload/upload?uploadPath=/wangeditor/img' // 配置服务器端地址
          this.editor.customConfig.uploadImgHeaders = {} // 自定义 header
          this.editor.customConfig.uploadFileName = 'file' // 后端接受上传文件的参数名
    
    
     customInsert: (insertImg, result, editor) => {
              // 图片上传成功,插入图片的回调  具体根据你返回的数据存储地址作为insertImg的入参
              insertImg(result.url)
            }

    2.后端接收到服务器,服务器上传到七牛云,然后删除服务器的图片

    /**
    	 * 上传文件
    	 * @return
    	 * @throws IOException
    	 * @throws IllegalStateException
    	 */
    	@RequestMapping("qiNiuYun/upload")
    	public AjaxJson qiNiuYun( HttpServletRequest request, HttpServletResponse response,MultipartFile file) throws IllegalStateException, IOException {
    		AjaxJson j = new AjaxJson();
    
    		String uploadPath = request.getParameter("uploadPath");
    		Calendar cal = Calendar.getInstance();
    		int year = cal.get(Calendar.YEAR);
    		int month = cal.get(Calendar.MONTH )+1;
    
    		String fileDir = FileKit.getAttachmentDir()+uploadPath+"/"+year+"/"+month+"/";
    		// 判断文件是否为空
    		if (!file.isEmpty()) {
    			String name = file.getOriginalFilename ();
    			if(fileProperties.isAvailable (name)) {
    				// 文件保存路径
    				// 转存文件
    				FileUtils.createDirectory (fileDir);
    				String filePath = fileDir + name;
    				File newFile = FileUtils.getAvailableFile (filePath, 0);
    				file.transferTo (newFile);
    				String url=QiNiuYunUploadUtil.fileUpload(newFile.getAbsolutePath (), System.currentTimeMillis()+name);
    				j.put ("url", url);
    
    				//把服务器上的文件删除
    				//new File(filePath).delete();
    				newFile.delete();
    				return j;
    			}else{
    				return AjaxJson.error ("请勿上传非法文件!");
    			}
    		}else {
    			return AjaxJson.error ("文件不存在!");
    		}
    	}
    

    3.以上代码用到的七牛云的工具类1

      

    package com.jeeplus.modules.utils;
     
    /**
     * 官方说:有些情况下,七牛返回给上传端的内容不是默认的hash和key形式,
     * 这种情况下,可能出现在自定义returnBody或者自定义了callbackBody的情况下,
     * 前者一般是服务端直传的场景,而后者则是接受上传回调的场景,这两种场景之下,
     * 都涉及到需要将自定义的回复内容解析为Java的类对象,一般建议在交互过程中,
     * 都采用JSON的方式,这样处理起来方法比较一致,而且JSON的方法最通用。
     * 详情:https://developer.qiniu.com/kodo/sdk/1239/java#server-upload
     * ctrl+f 输入关键字搜索:解析自定义回复内容
     */
    public class MyPutRet {
     
      public String key;
     
      public String hash;
     
      public String bucket;
     
      public long fsize;
     
      public String getKey() {
        return key;
      }
     
      public void setKey(String key) {
        this.key = key;
      }
     
      public String getHash() {
        return hash;
      }
     
      public void setHash(String hash) {
        this.hash = hash;
      }
     
      public String getBucket() {
        return bucket;
      }
     
      public void setBucket(String bucket) {
        this.bucket = bucket;
      }
     
      public long getFsize() {
        return fsize;
      }
     
      public void setFsize(long fsize) {
        this.fsize = fsize;
      }
    }

    4.以上代码用到的七牛云的工具类2  换上你的七牛云配置可以直接运行main方法测试

    package com.jeeplus.modules.utils;
    
    import cn.hutool.core.lang.UUID;
    import com.jeeplus.common.json.AjaxJson;
    import com.qiniu.cdn.CdnManager;
    import com.qiniu.common.QiniuException;
    import com.qiniu.common.Zone;
    import com.qiniu.http.Response;
    import com.qiniu.storage.BucketManager;
    import com.qiniu.storage.Configuration;
    import com.qiniu.storage.UploadManager;
    import com.qiniu.storage.model.DefaultPutRet;
    import com.qiniu.storage.persistent.FileRecorder;
    import com.qiniu.util.Auth;
    import com.qiniu.util.StringMap;
    
    import java.io.UnsupportedEncodingException;
    import java.net.URLEncoder;
    import java.nio.file.Paths;
    
    public class QiNiuYunUploadUtil {
    
      // 设置需要操作的账号的AK,https://developer.qiniu.com/kodo/sdk/1239/java#upload-token
      private static final String ACCESS_KEY = "111111111c87dH";
    
      // 设置需要操作的账号的SK,https://developer.qiniu.com/kodo/sdk/1239/java#upload-token
      private static final String SECRET_KEY = "45458nbnGQ4645ifEWD6545";
    
      // 要上传的空间,https://developer.qiniu.com/kodo/sdk/1239/java#upload-token
      private static final String BUCKET = "545gfgdf";
    
      // 域名domainOfBucket
      private static final String DOMAIN_OF_BUCKET = "http://www.zyjs9.com";
    
      // 华东是Zone.zone0(),华北是Zone.zone1(),华南是Zone.zone2(),北美是Zone.zoneNa0(), https://developer.qiniu.com/kodo/manual/1671/region-endpoint
      private static final Zone ZONE = Zone.zone1();   // todo
    
    
      public static Auth getAuth() {
        return Auth.create(ACCESS_KEY, SECRET_KEY);
      }
    
      /**
       * 获取上传凭证,https://developer.qiniu.com/kodo/sdk/1239/java#upload-flow
       */
    
      public static String getUploadCredential() {
        return getAuth().uploadToken(BUCKET);
      }
      public static String getUpToken(String bucketName, String key) {
                //insertOnly 如果希望只能上传指定key的文件,并且不允许修改,那么可以将下面的 insertOnly 属性值设为 1
                 return Auth.create(ACCESS_KEY, SECRET_KEY).uploadToken(bucketName, key, 3600, new StringMap().put("insertOnly", 0));
           }
    
      /**
       * 构造一个带指定 Region 对象的配置类
       */
      public static UploadManager buildUploadManager() {
        return new UploadManager(new Configuration(ZONE));
      }
    
    
      /**
       * 文件上传
       *
       * @param filePath 需要上传的文件本地路径
       * @param fileNameKey   需要自定义保存在七牛云的文件名字,即上传文件后保存在七牛云服务器中的文件名(默认不指定的情况下,以文件内容的hash值作为文件名)
       */
      public static String fileUpload(String filePath, String fileNameKey) {
    
        try {
          String upToken = getUpToken(BUCKET, fileNameKey);
          Response response = buildUploadManager().put(filePath, fileNameKey, upToken);
    
          MyPutRet myPutRet = response.jsonToObject(MyPutRet.class);
    //      DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);  // 解析上传成功的结果
          return buildPublicFileUrl(myPutRet.getKey());  // 返回的图片url
        } catch (Exception ex) {
          ex.printStackTrace();
        }
        return null;
      }
    
      /**
       * 根据文件名和域名返回图片的url,然后访问url直接就可以看到图片了
       *
       * @param fileNameKey 需要自定义保存在七牛云的文件名字,即上传文件后保存在七牛云服务器中的文件名(默认不指定的情况下,以文件内容的hash值作为文件名)
       */
      public static String buildPublicFileUrl(String fileNameKey) {
    
        try {
    
          String encodedFileName = URLEncoder.encode(fileNameKey, "utf-8");
          return String.format("%s/%s", DOMAIN_OF_BUCKET, encodedFileName);
    
        } catch (UnsupportedEncodingException e) {
          e.printStackTrace();
        }
        return null;
      }
    
    
      /**
       * 私有空间返回文件URL
       *
       * @param fileNameKey     需要自定义保存在七牛云的文件名字,即上传文件后保存在七牛云服务器中的文件名(默认不指定的情况下,以文件内容的hash值作为文件名)
       * @param expireInSeconds 过期时间,私有空间文件的访问链接超时时间,单位(秒)
       */
      public static String buildPrivateFileUrl(String fileNameKey, long expireInSeconds) {
    
        try {
    
          return getAuth().privateDownloadUrl(buildPublicFileUrl(fileNameKey), expireInSeconds);
    
        } catch (Exception e) {
          e.printStackTrace();
        }
        return null;
      }
    
    
      /**
       * 字节数组上传文件,然后返回文件的url,然后可以直接在公网上访问url看到文件了
       *
       * @param fileNameKey 需要自定义保存在七牛云的文件名字,即上传文件后保存在七牛云服务器中的文件名(默认不指定的情况下,以文件内容的hash值作为文件名)
       */
      public static String charArrayUpload(String fileNameKey, byte[] uploadBytes) {
    
        try {
    
          Response response = buildUploadManager().put(uploadBytes, fileNameKey, getUploadCredential());
    
    //      DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);  // 解析上传成功的结果
    
          MyPutRet myPutRet = response.jsonToObject(MyPutRet.class);
    
          return buildPublicFileUrl(myPutRet.getKey());  // 返回的文件url
    
        } catch (Exception ex) {
          ex.printStackTrace();
        }
        return null;
      }
    
    
      /**
       * 断点续传
       *
       * @param fileNameKey   需要自定义保存在七牛云的文件名字,即上传文件后保存在七牛云服务器中的文件名(默认不指定的情况下,以文件内容的hash值作为文件名)
       * @param localFilePath 文件路径, 如果是Windows情况下,格式是 D:\\qiniu\\test.png
       */
      public static String breakPointUpload(String localFilePath, String fileNameKey) {
    
        try {
    
          // 如果是Windows情况下,格式是 D:\\qiniu\\test.png
          String localTempDir = Paths.get(System.getenv("java.io.tmpdir"), BUCKET).toString();
    
          // 设置断点续传文件进度保存目录
          FileRecorder fileRecorder = new FileRecorder(localTempDir);
    
          // 构造一个带指定Zone对象的配置类
          Configuration cfg = new Configuration(ZONE);
          UploadManager uploadManager = new UploadManager(cfg, fileRecorder);
    
          Response response = uploadManager.put(localFilePath, fileNameKey, getUploadCredential());
          // 解析上传成功的结果
    //      DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
    
          MyPutRet myPutRet = response.jsonToObject(MyPutRet.class);
    
          return buildPublicFileUrl(myPutRet.getKey());  // 返回的文件url
    
        } catch (Exception ex2) {
          ex2.printStackTrace();
        }
        return null;
      }
    
      /**
       * 删除文件
       * @param url  文件的名字
       * @return
       * @throws Exception
       */
      public static String delete(String url) throws Exception{
        Configuration cfg = new Configuration(Zone.zone1());
        String key = url;
        Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
        BucketManager bucketManager = new BucketManager(auth, cfg);
        try {
          Response delete = bucketManager.delete(BUCKET, key);
          String s = delete.toString();
          return s;
    
        } catch (QiniuException ex) {
    //如果遇到异常,说明删除失败
          System.err.println(ex.code());
          System.err.println(ex.response.toString());
          return null;
    
        }}
      /**
       * 刷新
       * @param url  文件的全路径
       * @throws QiniuException
       */
      public static void refresh(String url) throws QiniuException{
        String [] urls = {url};
        Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);
        CdnManager c = new CdnManager(auth);
        c.refreshUrls(urls);
      }
    
    
      // 测试
      public static void main(String[] args) {
        // 上传图片
        String defaultPutRet = fileUpload ("D:\\111.jpg","12345656");
    
        System.out.println("====="+ System.currentTimeMillis());
    
       /*String fileNameKey = defaultPutRet.key; // key是文件名
    
        String s = buildPublicFileUrl(fileNameKey);  // 返回的图片网址
        System.out.println("ssss****" + s);*/
    
        //String url = fileUpload("D:\\1.png", "1");
    
        //System.out.println(url);
    
      }
      //删除
      public AjaxJson de(String url){
        String[] split = url.split("/");
        String name =split[1];
        try {
          Object delete = QiNiuYunUploadUtil.delete(url);
          QiNiuYunUploadUtil.refresh(url);
          return AjaxJson.success("成功").put("data",delete);
        } catch (Exception e) {
          e.printStackTrace();
          return AjaxJson.error("失败");
        }
      }
    }
  • 相关阅读:
    牛客网剑指offer第46题——孩子们的游戏(圆圈中最后剩下的数)
    不借助临时变量两数交换篇
    牛客网剑指offer第48题——不用加减乘除做加法
    牛客网剑指offer第44题——翻转单词顺序列
    双指针索引技术
    二叉树的下一个结点
    数组中的逆序对
    丑数
    野指针与空指针
    【转】以操作系统的角度述说线程与进程
  • 原文地址:https://www.cnblogs.com/nmdzwps/p/15927620.html
Copyright © 2020-2023  润新知