惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

PCI Perspectives
PCI Perspectives
P
Proofpoint News Feed
G
GRAHAM CLULEY
Know Your Adversary
Know Your Adversary
T
Tenable Blog
I
Intezer
Scott Helme
Scott Helme
Hacker News - Newest:
Hacker News - Newest: "LLM"
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Security Latest
Security Latest
SecWiki News
SecWiki News
Schneier on Security
Schneier on Security
T
The Exploit Database - CXSecurity.com
The Last Watchdog
The Last Watchdog
N
News and Events Feed by Topic
Google DeepMind News
Google DeepMind News
S
Secure Thoughts
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
H
Hacker News: Front Page
L
LINUX DO - 最新话题
U
Unit 42
宝玉的分享
宝玉的分享
Stack Overflow Blog
Stack Overflow Blog
L
LINUX DO - 热门话题
IT之家
IT之家
C
Cybersecurity and Infrastructure Security Agency CISA
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
量子位
博客园_首页
爱范儿
爱范儿
T
Threatpost
小众软件
小众软件
A
Arctic Wolf
Jina AI
Jina AI
H
Help Net Security
Webroot Blog
Webroot Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Cyberwarzone
Cyberwarzone
博客园 - 聂微东
月光博客
月光博客
The Register - Security
The Register - Security
Martin Fowler
Martin Fowler
博客园 - 司徒正美
V
V2EX
博客园 - Franky
B
Blog
B
Blog RSS Feed
H
Heimdal Security Blog
WordPress大学
WordPress大学
A
About on SuperTechFans

isaced

使用 TypeScript 构建的 appstore-connect-sdk 归档 我用 SwiftUI 写了一个 V2ex 客户端 Docker 容器化多应用部署 Swift Server-side SDWebImage 为什么无法读取 webpmux 生成的 WebP 动图? [译] 探索 Swift 4 中新的 String API 对一个 Django 站点做 ab 压力测试 fir-mac 开发笔记 iOS10 Safari 引导用户信任企业签名 Swift Web 开发之 Vapor - 模版 Leaf(三) Swift Web 开发之 Vapor - 路由(二) HoloLens 初体验 Swift Web 开发之 Vapor - 入门(一) Jenkins for iOS 搭建日记 iOS HOOK 注入与重签名 Xcode 使用 Configuration 来配置不同的项目环境 给 UIProgressView 脱掉那层微弱的渐变 初用 CocoaAsyncSocket 记一次 SQLite 性能优化 有多色 - 开发小记 海岛风情 - 泰国普吉岛六日游 EGOCache 源码解析 日语五十音假名临摹校验算法 [iOS] UITextView 追加文字自动跳到顶部解决方法 Cocoa 新的依赖管理工具:Carthage 新年快乐! 博客主机换到搬瓦工 写了个iOS小游戏:有多色 iOS 后台任务之 Long-running background task 悄悄的就必须用 XCode 5.1.1 上传了! HTTP Content-type 与 AFNetworking Objective-Cloud 初体验(1) 掌中站上架小记 NSLoger 上线了 Python Markdown 做语法限制 Nginx + Gunicorn + Django 部署小记 用Shell脚本批量裁剪App Icon各个尺寸 LaunchRocket使用小记 用宏提速NSCoding 2014新年伊始:近期读过的好文推荐 [iOS] stringWithFormat 和 initWithFormat 有何不同? Apache + Flask + mod_wsgi + Koding 部署小记 收集几个Objective-C的HTML解析库 NSMapTable: 不只是一个能放weak指针的 NSDictionary 2013,再见! Emlog到Typecho的迁移工具:emlog2typecho [iOS]给上拉下拉刷新PullToRefresh做本地化 [iOS]代码推荐:大图缩放视图 - Vertigo iOS:hidesBottomBarWhenPushed的正确用法 Xcode 5新的Interface Builder,你准备好了吗? [翻译]如何使用Django创建简单的博客 我的Mac音乐播放器 初识 NSDataDetector Objective-C 计算代码运行时间 WordPress上传文件自动重命名 iOS:仿jing.fm的音乐播放视图 我的啃黑苹果之路 关于 搜索 项目
图床从SAE迁移到七牛
2016-03-16 · via isaced

关于图床的又一次迁移·小记

最早博客用的国外一些支持外链的图床,担心速度和稳定性,后面利用 Migs 这个 PHP 小程序在 SAE 上搭建了一个图床,用了比较久,好一段时间前就想把 SAE 迁移到七牛,连图片上传脚本都写好了,一直没有对之前的图片做迁移,今天花了半天把迁移工作完成了。

迁移主要步骤如下:

  • 导出整个 Blog 数据库备份文件 (.sql)
  • 筛选出所有原 SAE 的图片 URL
  • 将所有原图下载到本地
  • 将所有下载到本地的原图批量上传到七牛的空间
  • 对 Blog 数据库备份文件批量替换 url 中的原 SAE 子域名到新的七牛子域名
  • 批量替换后的数据库备份文件上传到服务器还原

首先用 Swift 写了个简单的脚本把原有在 SAE 上的图片都下载到本地来:

//
//  main.swift
//  Download All Origin Image
//
//  Created by feeling on 16/3/16.
//
//

import Foundation

let fileName = "isaced.sql"

// 获取当前目录
let currentPath = NSString(string: NSFileManager.defaultManager().currentDirectoryPath)
print("Current Path:\(currentPath)")

// 源文件
let filePath = currentPath.stringByAppendingPathComponent(fileName)

// 从文件读取出字符串
let sql = try NSString(contentsOfFile: filePath, encoding: NSUTF8StringEncoding)

// 正则
func matchesForRegexInText(regex: String!, text: String!) -> [String] {

    do {
        let regex = try NSRegularExpression(pattern: regex, options: [])
        let nsString = text as NSString
        let results = regex.matchesInString(text,
            options: [], range: NSMakeRange(0, nsString.length))
        return results.map { nsString.substringWithRange($0.range)}
    } catch let error as NSError {
        print("invalid regex: \(error.localizedDescription)")
        return []
    }
}

// 用正则表达式查找出所有原 SAE 的图片路径
let imageURList = matchesForRegexInText("[a-zA-z]+://isaced-img.stor.sinaapp.com[^\\s\\\\)']*", text: sql as String)

let downloadQueue = NSOperationQueue()
downloadQueue.maxConcurrentOperationCount = 3

var i = 0
for imageUrlString in imageURList {
    let downloadOperation = NSBlockOperation(block: { () -> Void in
        let imageName = (imageUrlString as NSString).lastPathComponent
        var imageData = NSData(contentsOfURL: NSURL(string: imageUrlString)!)
        var imageWritePath = currentPath.stringByAppendingPathComponent("download")
        imageWritePath = (imageWritePath as NSString).stringByAppendingPathComponent(imageName)
        imageData!.writeToFile(imageWritePath, atomically: true)

        print(imageName,i++)
    })
    downloadQueue.addOperation(downloadOperation)
}

// 加上这行保证不让程序提前结束
NSRunLoop.mainRunLoop().run()

全部下载到一个名为 download 的文件夹中,然后通过七牛后台管理的在线批量上传传到七牛空间,保持文件名和原来一致,只是域名部分变了。

然后用 SublimeText 将所有 URL 中原域名(isaced-img.stor.sinaapp.com) 批量替换成七牛的域名(isaced.qiniudn.com)

用 scp 命令把 SQL 文件上传到服务器:

scp -P 123 /block/isaced.sql root@192.168.1.1:/root/blog/isaced_qiniu_tran.sql

-P :服务器端口号,切记不是小写的 p

Mysql 还原就行了~

> mysql
> use blog
> source backup.sql