阿里云對(duì)象存儲(chǔ)OSS

目錄:
一绢彤、什么是對(duì)象存儲(chǔ)OSS
二谴垫、基本概念
2.1、存儲(chǔ)空間(Bucket)
2.2存哲、對(duì)象/文件(Object)
2.3因宇、Region(地域)
2.4、Endpoint(訪(fǎng)問(wèn)域名)
2.5祟偷、AccessKey(訪(fǎng)問(wèn)密鑰)
2.6账忘、強(qiáng)一致性
2.7谚鄙、數(shù)據(jù)冗余機(jī)制
2.8嚷往、OSS 與文件系統(tǒng)的對(duì)比
三博杖、應(yīng)用場(chǎng)景
3.1婚惫、圖片和音視頻等應(yīng)用的海量存儲(chǔ)
3.2氛赐、網(wǎng)頁(yè)或者移動(dòng)應(yīng)用的靜態(tài)和動(dòng)態(tài)資源分離
3.3、云端數(shù)據(jù)處理
四先舷、實(shí)戰(zhàn)演練
4.1艰管、創(chuàng)建 Bucket
4.2、文件管理
4.3蒋川、SpringBoot整合OSS牲芋,實(shí)現(xiàn)上傳,下載以及查看
4.3.1捺球、前期準(zhǔn)備
4.3.2缸浦、配置application-oss.properties
4.3.3、創(chuàng)建一個(gè)配置類(lèi)
4.3.4氮兵、文件上傳到OSS
4.3.5裂逐、從OSS下載到本地
4.3.6、查看OSS存在的文件

一泣栈、什么是對(duì)象存儲(chǔ)OSS

阿里云對(duì)象存儲(chǔ)OSS(Object Storage Service)是阿里云提供的海量卜高、安全、低成本南片、高可靠的云存儲(chǔ)服務(wù)掺涛。其數(shù)據(jù)設(shè)計(jì)持久性不低于99.9999999999%(12個(gè)9),服務(wù)可用性(或業(yè)務(wù)連續(xù)性)不低于99.995%疼进。

OSS具有與平臺(tái)無(wú)關(guān)的RESTful API接口薪缆,您可以在任何應(yīng)用、任何時(shí)間伞广、任何地點(diǎn)存儲(chǔ)和訪(fǎng)問(wèn)任意類(lèi)型的數(shù)據(jù)矮燎。

二定血、基本概念

2.1、存儲(chǔ)空間(Bucket)

存儲(chǔ)空間是用戶(hù)用于存儲(chǔ)對(duì)象(Object)的容器诞外,所有的對(duì)象都必須隸屬于某個(gè)存儲(chǔ)空間澜沟。存儲(chǔ)空間具有各種配置屬性,包括地域峡谊、訪(fǎng)問(wèn)權(quán)限茫虽、存儲(chǔ)類(lèi)型等。用戶(hù)可以根據(jù)實(shí)際需求既们,創(chuàng)建不同類(lèi)型的存儲(chǔ)空間來(lái)存儲(chǔ)不同的數(shù)據(jù)濒析。

  • 同一個(gè)存儲(chǔ)空間的內(nèi)部是扁平的,沒(méi)有文件系統(tǒng)的目錄等概念啥纸,所有的對(duì)象都直接隸屬于其對(duì)應(yīng)的存儲(chǔ)空間号杏。
  • 每個(gè)用戶(hù)可以擁有多個(gè)存儲(chǔ)空間。
  • 存儲(chǔ)空間的名稱(chēng)在 OSS 范圍內(nèi)必須是全局唯一的斯棒,一旦創(chuàng)建之后無(wú)法修改名稱(chēng)盾致。
  • 存儲(chǔ)空間內(nèi)部的對(duì)象數(shù)目沒(méi)有限制。

存儲(chǔ)空間的命名規(guī)范如下:

  • 只能包括小寫(xiě)字母荣暮、數(shù)字和短橫線(xiàn)(-)庭惜。
  • 必須以小寫(xiě)字母或者數(shù)字開(kāi)頭和結(jié)尾。
  • 長(zhǎng)度必須在 3–63 字節(jié)之間穗酥。

2.2护赊、對(duì)象/文件(Object)

對(duì)象是 OSS 存儲(chǔ)數(shù)據(jù)的基本單元,也被稱(chēng)為 OSS 的文件砾跃。對(duì)象由元信息(Object Meta)骏啰,用戶(hù)數(shù)據(jù)(Data)和文件名(Key)組成。對(duì)象由存儲(chǔ)空間內(nèi)部唯一的 Key 來(lái)標(biāo)識(shí)抽高。對(duì)象元信息是一組鍵值對(duì)器一,表示了對(duì)象的一些屬性,比如最后修改時(shí)間厨内、大小等信息祈秕,同時(shí)用戶(hù)也可以在元信息中存儲(chǔ)一些自定義的信息。

對(duì)象的生命周期是從上傳成功到被刪除為止雏胃。在整個(gè)生命周期內(nèi)请毛,只有通過(guò)追加上傳的 Object 可以繼續(xù)通過(guò)追加上傳寫(xiě)入數(shù)據(jù),其他上傳方式上傳的 Object 內(nèi)容無(wú)法編輯瞭亮,您可以通過(guò)重復(fù)上傳同名的對(duì)象來(lái)覆蓋之前的對(duì)象方仿。

對(duì)象的命名規(guī)范如下:

  • 使用 UTF-8 編碼。
  • 長(zhǎng)度必須在 1–1023 字節(jié)之間。
  • 不能以正斜線(xiàn)(/)或者反斜線(xiàn)(\)開(kāi)頭仙蚜。

2.3此洲、Region(地域)

Region 表示 OSS 的數(shù)據(jù)中心所在物理位置。Region 是在創(chuàng)建 Bucket 的時(shí)候指定的委粉,一旦指定之后就不允許更改呜师。該 Bucket 下所有的 Object 都存儲(chǔ)在對(duì)應(yīng)的數(shù)據(jù)中心,目前不支持 Object 級(jí)別的 Region 設(shè)置贾节。

2.4汁汗、Endpoint(訪(fǎng)問(wèn)域名)

Endpoint 表示 OSS 對(duì)外服務(wù)的訪(fǎng)問(wèn)域名。OSS 以 HTTP RESTful API 的形式對(duì)外提供服務(wù)栗涂,當(dāng)訪(fǎng)問(wèn)不同的 Region 的時(shí)候知牌,需要不同的域名。通過(guò)內(nèi)網(wǎng)和外網(wǎng)訪(fǎng)問(wèn)同一個(gè) Region 所需要的 Endpoint 也是不同的斤程。

2.5角寸、AccessKey(訪(fǎng)問(wèn)密鑰)

AccessKey(簡(jiǎn)稱(chēng) AK)指的是訪(fǎng)問(wèn)身份驗(yàn)證中用到的 AccessKeyId 和 AccessKeySecret。OSS 通過(guò)使用 AccessKeyId 和 AccessKeySecret 對(duì)稱(chēng)加密的方法來(lái)驗(yàn)證某個(gè)請(qǐng)求的發(fā)送者身份忿墅。AccessKeyId 用于標(biāo)識(shí)用戶(hù)扁藕;AccessKeySecret 是用戶(hù)用于加密簽名字符串和 OSS 用來(lái)驗(yàn)證簽名字符串的密鑰,必須保密球匕。對(duì)于 OSS 來(lái)說(shuō)纹磺,AccessKey 的來(lái)源有:

  • Bucket 的擁有者申請(qǐng)的 AccessKey帖烘。
  • 被 Bucket 的擁有者通過(guò) RAM 授權(quán)給第三方請(qǐng)求者的 AccessKey亮曹。
  • 被 Bucket 的擁有者通過(guò) STS 授權(quán)給第三方請(qǐng)求者的 AccessKey。

2.6秘症、強(qiáng)一致性

Object 操作在 OSS 上具有原子性照卦,操作要么成功要么失敗,不會(huì)存在有中間狀態(tài)的 Object乡摹。OSS 保證用戶(hù)一旦上傳完成之后讀到的 Object 是完整的役耕,OSS 不會(huì)返回給用戶(hù)一個(gè)部分上傳成功的 Object。

Object 操作在 OSS 上同樣具有強(qiáng)一致性聪廉,用戶(hù)一旦收到了一個(gè)上傳(PUT)成功的響應(yīng)瞬痘,該上傳的 Object 就已經(jīng)立即可讀,并且 Object 的冗余數(shù)據(jù)已經(jīng)寫(xiě)成功板熊。不存在一種上傳的中間狀態(tài)框全,即 read-after-write 卻無(wú)法讀取到數(shù)據(jù)。對(duì)于刪除操作也是一樣的干签,用戶(hù)刪除指定的 Object 成功之后津辩,該 Object 立即變?yōu)椴淮嬖凇?/p>

2.7、數(shù)據(jù)冗余機(jī)制

OSS 采用數(shù)據(jù)冗余存儲(chǔ)機(jī)制,將每個(gè)對(duì)象的不同冗余存儲(chǔ)在同一個(gè)區(qū)域內(nèi)多個(gè)設(shè)施的多個(gè)設(shè)備上喘沿,確保硬件失效時(shí)的數(shù)據(jù)可靠性和可用性闸度。

  • OSS Object 操作具有強(qiáng)一致性,用戶(hù)一旦收到了上傳/復(fù)制成功的響應(yīng)蚜印,則該上傳的 Object 就已經(jīng)立即可讀莺禁,且數(shù)據(jù)已經(jīng)冗余寫(xiě)入到多個(gè)設(shè)備中。
  • OSS 會(huì)通過(guò)計(jì)算網(wǎng)絡(luò)流量包的校驗(yàn)和晒哄,驗(yàn)證數(shù)據(jù)包在客戶(hù)端和服務(wù)端之間傳輸中是否出錯(cuò)睁宰,保證數(shù)據(jù)完整傳輸。
  • OSS 的冗余存儲(chǔ)機(jī)制寝凌,可支持兩個(gè)存儲(chǔ)設(shè)施并發(fā)損壞時(shí)柒傻,仍維持?jǐn)?shù)據(jù)不丟失。
    a.當(dāng)數(shù)據(jù)存入 OSS 后较木,OSS 會(huì)檢測(cè)和修復(fù)丟失的冗余红符,確保數(shù)據(jù)可靠性和可用性。
    b. OSS 會(huì)周期性地通過(guò)校驗(yàn)等方式驗(yàn)證數(shù)據(jù)的完整性伐债,及時(shí)發(fā)現(xiàn)因硬件失效等原因造成的數(shù)據(jù)損壞预侯。當(dāng)檢測(cè)到數(shù)據(jù)有部分損壞或丟失時(shí),OSS 會(huì)利用冗余的數(shù)據(jù)峰锁,進(jìn)行重建并修復(fù)損壞數(shù)據(jù)萎馅。

2.8、OSS 與文件系統(tǒng)的對(duì)比

OSS 與文件系統(tǒng)的對(duì)比

三虹蒋、應(yīng)用場(chǎng)景

3.1糜芳、圖片和音視頻等應(yīng)用的海量存儲(chǔ)

OSS可用于圖片、音視頻魄衅、日志等海量文件的存儲(chǔ)峭竣。各種終端設(shè)備、Web網(wǎng)站程序晃虫、移動(dòng)應(yīng)用可以直接向OSS寫(xiě)入或讀取數(shù)據(jù)皆撩。OSS支持流式寫(xiě)入和文件寫(xiě)入兩種方式。


圖片和音視頻等應(yīng)用的海量存儲(chǔ)

3.2哲银、網(wǎng)頁(yè)或者移動(dòng)應(yīng)用的靜態(tài)和動(dòng)態(tài)資源分離

利用海量互聯(lián)網(wǎng)帶寬扛吞,OSS可以實(shí)現(xiàn)海量數(shù)據(jù)的互聯(lián)網(wǎng)并發(fā)下載。OSS提供原生的傳輸加速功能荆责,支持上傳加速滥比、下載加速,提升跨國(guó)草巡、跨洋數(shù)據(jù)上傳守呜、下載的體驗(yàn)型酥。


網(wǎng)頁(yè)或者移動(dòng)應(yīng)用的靜態(tài)和動(dòng)態(tài)資源分離

3.3、云端數(shù)據(jù)處理

上傳文件到OSS后查乒,可以配合媒體處理服務(wù)和圖片處理服務(wù)進(jìn)行云端的數(shù)據(jù)處理弥喉。


云端數(shù)據(jù)處理

四、實(shí)戰(zhàn)演練

前提:開(kāi)始使用"對(duì)象存儲(chǔ)OSS"首先要進(jìn)入到阿里云控制臺(tái)玛迄,控制臺(tái)地址:https://oss.console.aliyun.com/overview

4.1由境、創(chuàng)建 Bucket

進(jìn)入控制臺(tái),選擇對(duì)象存儲(chǔ)蓖议。然后點(diǎn)擊創(chuàng)建Bucket虏杰,如下圖所示


創(chuàng)建Bucket

4.2、文件管理

進(jìn)入剛才創(chuàng)建的Bucket中勒虾,進(jìn)行文件在線(xiàn)管理纺阔,如圖所示


文件管理

4.3、SpringBoot整合OSS修然,實(shí)現(xiàn)上傳笛钝,下載以及查看

4.3.1、前期準(zhǔn)備

 <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>2.8.3</version>
 </dependency>

4.3.2愕宋、配置application-oss.properties

##########阿里云對(duì)象存儲(chǔ)OSS###################
aliyun.endpoint=oss-cn-shanghai.aliyuncs.com
aliyun.accessKeyId=*******
aliyun.accessKeySecret=*******
aliyun.bucketName=phone-xby
aliyun.urlPrefix=http://phone-xby.oss-cn-shanghai.aliyuncs.com/ 

4.3.3玻靡、創(chuàng)建一個(gè)配置類(lèi)

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

/**
 *
 * @author Xiby
 *
 */
@Configuration
@PropertySource(value = {"classpath:application-oss.properties"})
@ConfigurationProperties(prefix = "aliyun")
@Data
public class AliyunConfig {
    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;
    private String urlPrefix;
    @Bean
    public OSS oSSClient() {
        return new OSSClient(endpoint, accessKeyId, accessKeySecret);
    }
}

4.3.4、文件上傳到OSS

4.3.4.1中贝、Controller類(lèi)

@Controller
public class AiliyunOSSController {


    @Autowired
    private AiliyunOSSService ailiyunOSSlService;

    /**
     * @param uploadFile
     * @return
     * @desc 上傳文件到OOS
     */

    @RequestMapping(value = {"/ailiyunOSS/uplodeFile"}, method = RequestMethod.POST)
    @ResponseBody
    public Message uplodeFile(@RequestParam("file") MultipartFile uploadFile) {
        return ailiyunOSSlService.upload( uploadFile );
    }
}

4.3.4.2囤捻、Service類(lèi)

import cn.hutool.core.date.DateTime;
import com.aliyun.oss.OSS;
import com.aliyun.oss.model.ListObjectsRequest;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;

@Service
public class AiliyunOSSServiceImpl implements AiliyunOSSService {

    private static final Logger logger = LoggerFactory.getLogger( Thread
            .currentThread().getStackTrace()[1].getClassName() );

    @Autowired
    private OSS ossClient;

    @Autowired
    private AliyunConfig aliyunConfig;



    @Override
    public Message upload(MultipartFile uploadFile) {

        Message m = new Message();

        String fileName = uploadFile.getOriginalFilename();

        try {
            ossClient.putObject( aliyunConfig.getBucketName(), fileName, new
                    ByteArrayInputStream( uploadFile.getBytes() ) );
        } catch (Exception e) {
            e.printStackTrace();
            //上傳失敗
            m.setResult( "002" );
            m.setDetail( "文件上傳失敗" );
            return m;
        }
        m.setResult( "001" );
        m.setDetail( "文件上傳成功" );
        logger.info( "OSS存儲(chǔ)路徑:{URL=" + this.aliyunConfig.getUrlPrefix() + fileName + "}" );
        return m;
    }
}

4.3.4.3.前端(Layui)

  <div class="layui-form-item" style="margin: 10px 0;">
          <label class="layui-form-label">所屬階段</label>
                 <div class="layui-input-block">
                        <button type="button" class="layui-btn" id="test1">
                                <i class="layui-icon">&#xe67c;</i>導(dǎo)入
                         </button>
               </div>
    </div>
   var uploadInst = upload.render({
        elem: '#test1' //綁定元素
        ,url: '/ailiyunOSS/uplodeFile' //上傳接口
        ,exts:'jpg|png|gif|bmp|jpeg|txt|word|docx|mp4|pdf|doc|xlsx|xls|pptx|ppt|wmv' 
        ,size:0
        ,done:function () {
            initTable();
        }

    });

4.3.5、從OSS下載到本地

4.3.5.1邻寿、Controller類(lèi)

   /**
     *
     * @author Xiby
     * 
     * @desc 根據(jù)文件名下載oss上的文件
     *
     * @Param fileNames
     */
    @RequestMapping(value = {"/ailiyunOSS/exportFile/{fileNames:.*}"}, method = RequestMethod.GET)

    @ResponseBody
    public void downloadFile(@PathVariable("fileNames") String fileNames,HttpServletResponse response){

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType( MediaType.APPLICATION_OCTET_STREAM );
        ailiyunOSSlService.downloadFile(fileNames,response);


    }

4.3.5.2蝎土、Servicel類(lèi)

    @Override
    public void downloadFile(String fileNames, HttpServletResponse response) {

        try {

            OSSObject ossObject = ossClient.getObject( aliyunConfig.getBucketName(), fileNames );
            BufferedInputStream in = new BufferedInputStream( ossObject.getObjectContent() );
            BufferedOutputStream out = new BufferedOutputStream( response.getOutputStream() );
            response.setHeader( "Content-Disposition", "attachment;filename=" + URLEncoder.encode( fileNames, "utf-8" ) );

            byte[] car = new byte[1024];
            int L = 0;
            while ((L = in.read( car )) != -1) {
                out.write( car, 0, L );
            }
            if (out != null) {
                out.flush();
                out.close();
            }
            if (in != null) {
                in.close();
            }
            ossClient.shutdown();

        } catch (Exception e) {
            e.printStackTrace();
        }

    }


4.3.5.3、前端

 <a class="layui-btn layui-btn-xs export" lay-event="exportCsv">下載</a>
 var $form = $('<form method="GET"></form>');
            $form.attr('action', '/ailiyunOSS/exportFile/'+ encodeURI(fileNames));
            $form.appendTo($('body'));
            $form.submit();

4.3.6老厌、查看OSS存在的文件

4.3.6.1瘟则、Controller類(lèi)

 @RequestMapping("/ailiyunOSS/queryFile")
    @ResponseBody
    public GriddataPageinfo list()
            throws Exception {
        return this.ailiyunOSSlService.list();
    }

4.3.6.2黎炉、Service類(lèi)

 @Override
    public GriddataPageinfo list() {
        final int maxKeys = 100;
        ObjectListing objectListing = ossClient.listObjects( new ListObjectsRequest( aliyunConfig.getBucketName() ).withMaxKeys( maxKeys ) );
        List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
        return new GriddataPageinfo( sums.size(), sums );
    }

4.3.6.3枝秤、前端

   var initTable = function () {
        tObj = table.render({
            id:'testReload',
            elem: '#datagrid',
            height: 500,
            url: web_path + '/ailiyunOSS/queryFile',
            response: {
                countName: 'total',
                dataName: 'rows'
            },
            page: true,
            cols: [[
                {field: 'bucketName',width: 200, title: '文件管理'},
                {field: 'lastModified',width: 200, title: '上傳時(shí)間'},
                {field: 'key',width: 800, title: '文件存儲(chǔ)路徑'},
                {field: 'size',width: 225, title: '文件大小(B)'},
                {field: 'tools',fixed: 'right', title: '操作',  align: 'center', toolbar: '#showBar',width:150}
            ]]
        });

    };

目前文章就介紹到這里了,想要查看了解更多更詳細(xì)的對(duì)象存儲(chǔ)OSS的操作慷嗜,請(qǐng)查看官方文檔
本文參考文獻(xiàn):https://help.aliyun.com/document_detail/31817.html?spm=a2c4g.11186623.6.543.1fa66820dbcDTj

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末淀弹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子庆械,更是在濱河造成了極大的恐慌薇溃,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缭乘,死亡現(xiàn)場(chǎng)離奇詭異沐序,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)策幼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)邑时,“玉大人,你說(shuō)我怎么就攤上這事特姐【穑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵唐含,是天一觀(guān)的道長(zhǎng)浅浮。 經(jīng)常有香客問(wèn)我,道長(zhǎng)捷枯,這世上最難降的妖魔是什么滚秩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮淮捆,結(jié)果婚禮上叔遂,老公的妹妹穿的比我還像新娘。我一直安慰自己争剿,他們只是感情好已艰,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著蚕苇,像睡著了一般哩掺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涩笤,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天嚼吞,我揣著相機(jī)與錄音,去河邊找鬼蹬碧。 笑死舱禽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的恩沽。 我是一名探鬼主播誊稚,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼罗心!你這毒婦竟也來(lái)了里伯?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤渤闷,失蹤者是張志新(化名)和其女友劉穎疾瓮,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體飒箭,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狼电,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年蜒灰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肩碟。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卷员,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腾务,到底是詐尸還是另有隱情毕骡,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布岩瘦,位于F島的核電站未巫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏启昧。R本人自食惡果不足惜叙凡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望密末。 院中可真熱鬧握爷,春花似錦、人聲如沸严里。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)刹碾。三九已至燥撞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間迷帜,已是汗流浹背物舒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留戏锹,地道東北人冠胯。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像锦针,于是被迫代替她去往敵國(guó)和親荠察。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359