发表于: 2020-08-10 23:40:29

1 2277


  • 今天完成的事情:任务七的邮件整理
    明天计划的事情:收尾工作。。。。
    遇到的问题:暂无
    收获:

  • 短信的最终整理

  • 1.导入依赖<dependency>

  •   <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.5.1</version>
    </dependency>
    <dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-ecs</artifactId>
    <version>4.19.9</version>
    </dependency>
    <dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
    <version>1.0.0</version>
    </dependency>

    控制层发送短信,传递参数为手机号,并调用Service处理

  • public class SendSms {
    private Logger logger = LoggerFactory.getLogger(SendSms.class);
    //初始化ascClient,暂时不支持多region(请勿修改)
       private String accessKeyId;//你的accessKeyId
       private String accessKeySecret;//你的accessKeySecret
       private String templateCode;
    private String signName;
    //初始化ascClient需要的几个参数
       private String product;//短信API产品名称(短信产品名固定,无需修改)
       private String domain;//短信API产品域名(接口地址固定,无需修改)

       public String getSms(String phone, String code){
    //设置超时时间-可自行调整
          System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
    System.setProperty("sun.net.client.defaultReadTimeout", "10000");

    IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId,
    accessKeySecret);
    try {
    DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
    } catch (ClientException e) {
    e.printStackTrace();
    logger.info(e.getMessage());
    }
    IAcsClient acsClient = new DefaultAcsClient(profile);

    //组装请求对象
          SendSmsRequest request = new SendSmsRequest();
    //使用post提交
          request.setMethod(MethodType.POST);
    //必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式;发送国际/港澳台消息时,接收号码格式为国际区号+号码,如“85200000000”
          request.setPhoneNumbers(phone);
    //必填:短信签名-可在短信控制台中找到
          request.setSignName(signName);
    //必填:短信模板-可在短信控制台中找到,发送国际/港澳台消息时,请使用国际/港澳台短信模版
          request.setTemplateCode(templateCode);
    //可选:模板中的变量替换JSON,如模板内容为"亲爱的${name},您的验证码为${code}",此处的值为
          //友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败
           //参考:request.setTemplateParam("{\"变量1\":\"1\",\"变量2\":\"2\",\"变量3\":\"3\"}")
          request.setTemplateParam(code);
    //可选-上行短信扩展码(扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段)
          //request.setSmsUpExtendCode("90997");

          //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
          //request.setOutId("yourOutId");

           //请求失败这里会抛ClientException异常
          SendSmsResponse sendSmsResponse = null;
    try {
    sendSmsResponse = acsClient.getAcsResponse(request);
    } catch (ClientException e) {
    e.printStackTrace();
    logger.info(e.getMessage());
    }
    if(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
    System.out.println("短信发送成功");
    return "短信发送成功!";
    //请求成功
          }
    return "短信发送失败!";
    }

    /**
        *
        * @param phone 接收短信的手机号码。
        * @param time  短信发送日期,支持查询最近30天的记录。格式为yyyyMMdd,例如20181225
        * @param PageSize 分页查看发送记录,指定每页显示的短信记录数量。取值范围为1~50
        * @param CurrentPage 分页查看发送记录,指定发送记录的的当前页码。
        * @return 字符串
        */
       public String QuerySendDetails(String phone,String time,String PageSize,String CurrentPage) {
    DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId,accessKeySecret);
    IAcsClient client = new DefaultAcsClient(profile);

    CommonRequest request = new CommonRequest();
    request.setSysMethod(MethodType.POST);
    request.setSysDomain("dysmsapi.aliyuncs.com");
    request.setSysVersion("2017-05-25");
    request.setSysAction("QuerySendDetails");
    request.putQueryParameter("RegionId", "cn-hangzhou");
    request.putQueryParameter("PhoneNumber",phone);
    request.putQueryParameter("SendDate",time);
    request.putQueryParameter("PageSize",PageSize);
    request.putQueryParameter("CurrentPage",CurrentPage);
    //发送回执ID,即发送流水号。调用发送接口SendSmsSendBatchSms发送短信时,返回值中的BizId字段。
               //request.putQueryParameter("BizId", "*****");
               try {
    CommonResponse response = client.getCommonResponse(request);
    return response.getData();
    } catch (ServerException e) {
    e.printStackTrace();
    logger.info(e.getMessage());
    } catch (ClientException e) {
    e.printStackTrace();
    logger.info(e.getMessage());
    }
    return "返回为空。";
    }
    public String getProduct() {
    return product;
    }

    public void setProduct(String product) {
    this.product = product;
    }

    public String getDomain() {
    return domain;
    }

    public void setDomain(String domain) {
    this.domain = domain;
    }

    public String getAccessKeyId() {
    return accessKeyId;
    }

    public void setAccessKeyId(String accessKeyId) {
    this.accessKeyId = accessKeyId;
    }

    public String getAccessKeySecret() {
    return accessKeySecret;
    }

    public void setAccessKeySecret(String accessKeySecret) {
    this.accessKeySecret = accessKeySecret;
    }

    public String getTemplateCode() {
    return templateCode;
    }

    public void setTemplateCode(String templateCode) {
    this.templateCode = templateCode;
    }

    public String getSignName() {
    return signName;
    }

    public void setSignName(String signName) {
    this.signName = signName;
    }
    }
  • 邮件调用

  • 控制层调用

  • /**
    * 邮件发送
    * @param email
    */
    @RequestMapping("/sendMail")
    public void sendMail(String email){
    aliyunMail.sendMail(email);
    }

    Service处理

  • @Service
    public class AliyunMailServiceImpl implements aliyunMailService {
    private Logger logger = LoggerFactory.getLogger(AliyunMailServiceImpl.class);

    @Override
       public String sendMail(String maile) {
    SendMail Mail = new SendMail();
    boolean flg = Mail.sendMail(maile);
    if(flg==true){
    logger.info("邮件发送成功");
    return "邮件发送成功";
    }
    logger.info("邮件发送失败");
    return "邮件发送失败";
    }
    }

    调用阿里云API自定义为SendMail

  • public class SendMail {
    private String RegionId;
    private String AccountName;//我的发信地址
       private int AddressType;//地址类型。取值:0:为随机账号1:为发信地址
       private boolean ReplyToAddress;
    private String Subject;//邮件主题
       private String accessKeyId;
    private String accessSecret;
    private Logger logger = LoggerFactory.getLogger(SendMail.class);

    public boolean sendMail(String maile) {

    DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou",accessKeyId,accessSecret);
    IAcsClient client = new DefaultAcsClient(profile);

    SingleSendMailRequest request = new SingleSendMailRequest();
    request.setRegionId(RegionId);
    request.setAccountName(AccountName);
    request.setAddressType(AddressType);
    request.setReplyToAddress(ReplyToAddress);
    request.setToAddress(maile);
    request.setSubject(Subject);


    try {
    SingleSendMailResponse response = client.getAcsResponse(request);
    System.out.println(new Gson().toJson(response));
    } catch (ServerException e) {
    e.printStackTrace();
    logger.info(e.getMessage());
    } catch (ClientException e) {
    logger.info("ErrCode:" + e.getErrCode()+"ErrMsg:" + e.getErrMsg()+"RequestId:" + e.getRequestId());
    System.out.println("ErrCode:" + e.getErrCode());
    System.out.println("ErrMsg:" + e.getErrMsg());
    System.out.println("RequestId:" + e.getRequestId());
    return false;
    }
    return true;
    }
    public String getRegionId() {
    return RegionId;
    }

    public void setRegionId(String regionId) {
    RegionId = regionId;
    }

    public String getAccountName() {
    return AccountName;
    }

    public void setAccountName(String accountName) {
    AccountName = accountName;
    }

    public int getAddressType() {
    return AddressType;
    }

    public void setAddressType(int addressType) {
    AddressType = addressType;
    }

    public boolean isReplyToAddress() {
    return ReplyToAddress;
    }

    public void setReplyToAddress(boolean replyToAddress) {
    ReplyToAddress = replyToAddress;
    }

    public String getSubject() {
    return Subject;
    }

    public void setSubject(String subject) {
    Subject = subject;
    }

    public String getAccessKeyId() {
    return accessKeyId;
    }

    public void setAccessKeyId(String accessKeyId) {
    this.accessKeyId = accessKeyId;
    }

    public String getAccessSecret() {
    return accessSecret;
    }

    public void setAccessSecret(String accessSecret) {
    this.accessSecret = accessSecret;
    }
    }


  • 深度思考---2. 如何调用第三方API实现图片上传?

  • 目前学习到一种利用SpringMVC使用MultipartFile实现文件上传

  • (1)使用MultipartFile类接收上传的图片;

    (2)将图片存储在服务器(阿里云OSS),返回一个图片路径;

    (3)图片路径存储在用户信息中以供调HTML中form mata方式上传的文件用。

    2.1 HTML中form mata方式上传的文件,一定要改form表单中提交的方式。

  • 要到导入SpringMVC相关包和commons-io的jar包

  • <dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
    </dependency>
    <!--webMVC相关包-->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
    </dependency>

    2.3控制层方法,首先分析API需要什么参数,然后从控制层只传入什么参数,service做逻辑处理。

  • /**
    * 使用springmvc实现上传,采用MultipartFiletransfer()
    * @param uploadFile
    * @param session
    * @return
    * @throws Exception
    */
    @RequestMapping(value="/upload", method = RequestMethod.POST)
    public String upFile (MultipartFile uploadFile, HttpSession session) throws Exception {
            //获取上传文件的名称
       String fileName = uploadFile.getOriginalFilename();
            //解决文件重名问题  重新拼装文件名
       String finalFileName = UUID.randomUUID().toString()+fileName.substring(fileName.lastIndexOf("."));
            //获取上传文件的路径
       String path = session.getServletContext().getRealPath("photo")+File.separator+finalFileName;
    uploadFile.transferTo(new File(path));
    aliyunOss.putfile("img",finalFileName,path);
    return "success";
    }

    调用的阿里云API

  • /**
    * 上传文件
    * @param bucketName
    * @param objectName
    * @param path
    * @return
    */
    public void putfile(String bucketName,String objectName,String path){
    //Endpoint以杭州为例,其它Region请按实际情况填写。
       String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
    // 创建OSSClient实例。
       OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    // 创建PutObjectRequest对象。
       PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, "<yourObjectName>", new File("<yourLocalFile>"));

    // 上传文件流。
       InputStream inputStream = null;
    try {
    inputStream = new FileInputStream(path);
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    }
    ossClient.putObject(bucketName, objectName, inputStream);
    // 关闭OSSClient
       ossClient.shutdown();
    }

    2.4配置ApplicationContext

  • <!--id为固定的,只能为multipartResolver
       作用:将客户端上传的file对象转换成MultipartFile对象,设置文件解析的编码一定要与页面编码保持一致pageEncoding
     xml的属性是纯文本,不能写运算符,属性
       defaultEncoding配置请求的编码格式,默认为iso-8859-1
       maxUploadSize配置文件的最大单位,单位为字节
       maxInMemorySize配置上传文件的缓存 ,单位为字节
       resolveLazily属性启用是为了推迟文件解析,以便在UploadAction 中捕获文件大小异常
           -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="defaultEncoding" value="utf-8"/>
    <property name="maxUploadSize" value="88888888"/>
    <property name="maxInMemorySize" value="4096" />
    <property name="resolveLazily" value="true" />
    </bean>

返回列表 返回列表
评论

    分享到