baiduvideoiphone://?id=13802open type hierarchy=4 op=opendetai

ueditor文件上传研究 - 勤奋的asialee的博客 - ITeye技术网站
博客分类:
之前写过一版本的ueditor的使用方式,感觉后来ueditor升级很快,转眼间又升级了,今天有一个人问这块相关的问题,正好又熟悉下。
首先最基本的用法我就不讲了,只讲文件上传的这块。
首先,文件上传这块和之前的变化很大,先慢慢的讲讲用法。
1. java版本的在jsp目录的文件结构如下:
从这地方可以看出来,有一个controller.jsp, 一个config.json,一堆jar文件, 这个和之前版本是不一致的。
2. maven工程的jar包的引用
如果没有使用jar包,很容易,直接copy文件就可以,但是maven的方式,这个jar又在网上没有,索幸maven提供了system方式的依赖方式:
& dependency&
& groupId& com.baidu.ueditor &/groupId &
& artifactId& ueditor &/artifactId &
& version& 1.1.1 &/version &
& scope& system &/scope &
& systemPath& ${basedir}/ src/main/webapp /WEB-INF/lib/ ueditor-1.1.1.jar &/systemPath &
&/ dependency&
maven的jar包的放置位置如下:
其他的jar我就不多讲了,都很容易找。
3. controller.jsp文件阅读
&%@ page language="java" contentType="text/ charset=UTF-8"
import="com.baidu.ueditor.ActionEnter"
pageEncoding="UTF-8"%&
&%@ page trimDirectiveWhitespaces="true" %&
request.setCharacterEncoding( "utf-8" );
response.setHeader("Content-Type" , "text/html");
String rootPath = application.getRealPath( "/" );
out.write( new ActionEnter( request, rootPath ).exec() );
从代码来看,rootPath其实就是项目的根路径,构建了ActionEnter,并调用了exec函数。
我们来看下ActionEnter的代码:
package com.baidu.
import com.baidu.ueditor.define.ActionM
import com.baidu.ueditor.define.BaseS
import com.baidu.ueditor.define.S
import com.baidu.ueditor.hunter.FileM
import com.baidu.ueditor.hunter.ImageH
import com.baidu.ueditor.upload.U
import java.util.M
import javax.servlet.http.HttpServletR
import org.json.JSONO
public class ActionEnter
private HttpServletRequest request =
private String rootPath =
private String contextPath =
private String actionType =
private ConfigManager configManager =
public ActionEnter(HttpServletRequest request, String rootPath)
this.request =
this.rootPath = rootP
// 对action进行赋值。
this.actionType = request.getParameter("action");
this.contextPath = request.getContextPath();
// 构建configManager类
this.configManager = ConfigManager.getInstance(this.rootPath, this.contextPath, request.getRequestURI());
public String exec()
// 这个是处理jsonp的形式,一般都是不跨域的。
String callbackName = this.request.getParameter("callback");
if (callbackName != null)
if (!validCallbackName(callbackName)) {
return new BaseState(false, 401).toJSONString();
return callbackName + "(" + invoke() + ");";
return invoke();
public String invoke()
// 判断action是否合法,如果不合法返回一个非法状态
if ((this.actionType == null) || (!ActionMap.mapping.containsKey(this.actionType))) {
return new BaseState(false, 101).toJSONString();
// 如果找不到configManager也报错
if ((this.configManager == null) || (!this.configManager.valid())) {
return new BaseState(false, 102).toJSONString();
State state =
// 取得actionCode
int actionCode = ActionMap.getType(this.actionType);
Map conf =
switch (actionCode)
return this.configManager.getAllConfig().toString();
// 处理上传文件
conf = this.configManager.getConfig(actionCode);
state = new Uploader(this.request, conf).doExec();
conf = this.configManager.getConfig(actionCode);
String[] list = this.request.getParameterValues((String)conf.get("fieldName"));
// 处理在线编辑
state = new ImageHunter(conf).capture(list);
conf = this.configManager.getConfig(actionCode);
int start = getStartIndex();
// 处理文件list
state = new FileManager(conf).listFile(start);
return state.toJSONString();
public int getStartIndex()
String start = this.request.getParameter("start");
return Integer.parseInt(start); } catch (Exception e) {
public boolean validCallbackName(String name)
if (name.matches("^[a-zA-Z_]+[\\w0-9_]*$")) {
我们慢慢的来看这个函数:首先在构造函数里面调用了request.getContextPath()和request.getRequestURI()函数。
假设我们的项目的contextPath为:test,那么下面两个函数的返回值则如下:
request.getContextPath
request.getRequestURI
/test/resources/ueditor/jsp/controller.jsp
我们还是先来看下ConfigManager类吧。
package com.baidu.
import java.io.BufferedR
import java.io.F
import java.io.FileInputS
import java.io.FileNotFoundE
import java.io.IOE
import java.io.InputStreamR
import java.io.UnsupportedEncodingE
import java.util.HashM
import java.util.M
import org.json.JSONA
import org.json.JSONO
public final class ConfigManager
private final String rootP
private final String originalP
private final String contextP
private static final String configFileName = "config.json";
private String parentPath =
private JSONObject jsonConfig =
private static final String SCRAWL_FILE_NAME = "scrawl";
private static final String REMOTE_FILE_NAME = "remote";
private ConfigManager(String rootPath, String contextPath, String uri)
throws FileNotFoundException, IOException
rootPath = rootPath.replace("\\", "/");
this.rootPath = rootP
this.contextPath = contextP
// 这个地方要特别注意,originalPath其实就是controller.jsp所在的路径
if (contextPath.length() & 0)
this.originalPath = (this.rootPath + uri.substring(contextPath.length()));
this.originalPath = (this.rootPath + uri);
initEnv();
public static ConfigManager getInstance(String rootPath, String contextPath, String uri)
return new ConfigManager(rootPath, contextPath, uri); } catch (Exception e) {
public boolean valid()
return this.jsonConfig !=
public JSONObject getAllConfig()
return this.jsonC
public Map&String, Object& getConfig(int type)
Map conf = new HashMap();
String savePath =
// 根据不同的code来解析config.json的配置文件
switch (type)
conf.put("isBase64", "false");
conf.put("maxSize", Long.valueOf(this.jsonConfig.getLong("fileMaxSize")));
conf.put("allowFiles", getArray("fileAllowFiles"));
conf.put("fieldName", this.jsonConfig.getString("fileFieldName"));
savePath = this.jsonConfig.getString("filePathFormat");
conf.put("isBase64", "false");
conf.put("maxSize", Long.valueOf(this.jsonConfig.getLong("imageMaxSize")));
conf.put("allowFiles", getArray("imageAllowFiles"));
conf.put("fieldName", this.jsonConfig.getString("imageFieldName"));
savePath = this.jsonConfig.getString("imagePathFormat");
conf.put("maxSize", Long.valueOf(this.jsonConfig.getLong("videoMaxSize")));
conf.put("allowFiles", getArray("videoAllowFiles"));
conf.put("fieldName", this.jsonConfig.getString("videoFieldName"));
savePath = this.jsonConfig.getString("videoPathFormat");
conf.put("filename", "scrawl");
conf.put("maxSize", Long.valueOf(this.jsonConfig.getLong("scrawlMaxSize")));
conf.put("fieldName", this.jsonConfig.getString("scrawlFieldName"));
conf.put("isBase64", "true");
savePath = this.jsonConfig.getString("scrawlPathFormat");
conf.put("filename", "remote");
conf.put("filter", getArray("catcherLocalDomain"));
conf.put("maxSize", Long.valueOf(this.jsonConfig.getLong("catcherMaxSize")));
conf.put("allowFiles", getArray("catcherAllowFiles"));
conf.put("fieldName", this.jsonConfig.getString("catcherFieldName") + "[]");
savePath = this.jsonConfig.getString("catcherPathFormat");
conf.put("allowFiles", getArray("imageManagerAllowFiles"));
conf.put("dir", this.jsonConfig.getString("imageManagerListPath"));
conf.put("count", Integer.valueOf(this.jsonConfig.getInt("imageManagerListSize")));
conf.put("allowFiles", getArray("fileManagerAllowFiles"));
conf.put("dir", this.jsonConfig.getString("fileManagerListPath"));
conf.put("count", Integer.valueOf(this.jsonConfig.getInt("fileManagerListSize")));
conf.put("savePath", savePath);
conf.put("rootPath", this.rootPath);
// 加载config.json配置文件
private void initEnv()
throws FileNotFoundException, IOException
File file = new File(this.originalPath);
if (!file.isAbsolute()) {
file = new File(file.getAbsolutePath());
this.parentPath = file.getParent();
String configContent = readFile(getConfigPath());
JSONObject jsonConfig = new JSONObject(configContent);
this.jsonConfig = jsonC
} catch (Exception e) {
this.jsonConfig =
private String getConfigPath()
return this.parentPath + File.separator + "config.json";
private String[] getArray(String key)
JSONArray jsonArray = this.jsonConfig.getJSONArray(key);
String[] result = new String[jsonArray.length()];
int i = 0; for (int len = jsonArray.length(); i & i++) {
result[i] = jsonArray.getString(i);
// 读取config.json里面的内容
private String readFile(String path)
throws IOException
StringBuilder builder = new StringBuilder();
InputStreamReader reader = new InputStreamReader(new FileInputStream(path), "UTF-8");
BufferedReader bfReader = new BufferedReader(reader);
String tmpContent =
while ((tmpContent = bfReader.readLine()) != null) {
builder.append(tmpContent);
bfReader.close();
catch (UnsupportedEncodingException localUnsupportedEncodingException)
return filter(builder.toString());
private String filter(String input)
return input.replaceAll("/\\*[\\s\\S]*?\\*/", "");
我们再来看Uploader函数,其实很简单:
package com.baidu.ueditor.
import com.baidu.ueditor.define.S
import java.util.M
import javax.servlet.http.HttpServletR
public class Uploader
private HttpServletRequest request =
private Map&String, Object& conf =
public Uploader(HttpServletRequest request, Map&String, Object& conf) {
this.request =
this.conf =
public final State doExec() {
String filedName = (String)this.conf.get("fieldName");
State state =
if ("true".equals(this.conf.get("isBase64")))
state = Base64Uploader.save(this.request.getParameter(filedName),
this.conf);
state = BinaryUploader.save(this.request, this.conf);
这个很好理解,我们接着来看BinaryUploader类:
package com.baidu.ueditor.
import com.baidu.ueditor.PathF
import com.baidu.ueditor.define.BaseS
import com.baidu.ueditor.define.FileT
import com.baidu.ueditor.define.S
import java.io.IOE
import java.io.InputS
import java.util.A
import java.util.L
import java.util.M
import javax.servlet.http.HttpServletR
import mons.fileupload.FileItemI
import mons.fileupload.FileItemS
import mons.fileupload.FileUploadE
import mons.fileupload.disk.DiskFileItemF
import mons.fileupload.servlet.ServletFileU
public class BinaryUploader
// 使用fileupload来处理文件上传
public static final State save(HttpServletRequest request, Map&String, Object& conf)
FileItemStream fileStream =
boolean isAjaxUpload = request.getHeader("X_Requested_With") !=
if (!ServletFileUpload.isMultipartContent(request)) {
return new BaseState(false, 5);
ServletFileUpload upload = new ServletFileUpload(
new DiskFileItemFactory());
if (isAjaxUpload) {
upload.setHeaderEncoding("UTF-8");
FileItemIterator iterator = upload.getItemIterator(request);
while (iterator.hasNext()) {
fileStream = iterator.next();
if (!fileStream.isFormField())
fileStream =
if (fileStream == null) {
return new BaseState(false, 7);
String savePath = (String)conf.get("savePath");
String originFileName = fileStream.getName();
String suffix = FileType.getSuffixByFilename(originFileName);
originFileName = originFileName.substring(0,
originFileName.length() - suffix.length());
savePath = savePath +
long maxSize = ((Long)conf.get("maxSize")).longValue();
if (!validType(suffix, (String[])conf.get("allowFiles"))) {
return new BaseState(false, 8);
savePath = PathFormat.parse(savePath, originFileName);
String physicalPath = (String)conf.get("rootPath") + saveP
// 调用存储类来处理文件存储
InputStream is = fileStream.openStream();
State storageState = StorageManager.saveFileByInputStream(is,
physicalPath, maxSize);
is.close();
if (storageState.isSuccess()) {
storageState.putInfo("url", PathFormat.format(savePath));
storageState.putInfo("type", suffix);
storageState.putInfo("original", originFileName + suffix);
return storageS
} catch (FileUploadException e) {
return new BaseState(false, 6);
} catch (IOException localIOException) {
return new BaseState(false, 4);
private static boolean validType(String type, String[] allowTypes) {
List list = Arrays.asList(allowTypes);
return list.contains(type);
StorageManager我们就不看了,无非就是做一些文件存储的一些事情,下面我们来分析下这种实现方式的问题。
最后我稍微总结下看这个代码得收获和对作者的建议:
从这个地方来看,无法将图片放置在外部路径,因为这种实现就决定了只能放到项目路径下,这个最大的问题就是,有可能不小心,重新上下线,内容全部丢了。
从实现来看,大量的使用静态调用,基本上无法二次开发,不能灵活的继承它来处理个性化的东西,比如如果存储到fastDFS里面,这个就需要改里面的代码,不能通过扩展的方式来进行
config.json里面的配置项转换的时候,进行了重命名,这个地方就要求读者要记两个变量名,比如:imagePathFormat变成了savePath, 感觉好像挺好理解,但是这种明显不是好的方式,如果里面存在一个这个逻辑,最好显式的说明,而不是硬编码
源代码不开放,无法进行扩展和修改,建议作者开发这个jar到github里面,社区一块维护
下载次数: 327
下载次数: 437
浏览 38763
楼主,小弟实在不明白,ActionMap里的Map&String, Integer& mapping = new HashMap() {};是什么意思?这算什么初始化方法呢?实在看不懂,如果是匿名内部类,我还是看不懂还有getType()方法,Type都是ActionMap的成员变量,也没见哪里设置进mapping了,mapping.get(key)方法是如果运作的?还请楼主大人为小弟解除疑惑这个应该是反编译的有问题,我看了下官方现在也开源了,代码如下:感谢你的认真,我感觉你会成长进步的。
package com.baidu.ueditor.
import java.util.M
import java.util.HashM
* 定义请求action类型
@SuppressWarnings("serial")
public final class ActionMap {
public static final Map&String, Integer&
// 获取配置请求
public static final int CONFIG = 0;
public static final int UPLOAD_IMAGE = 1;
public static final int UPLOAD_SCRAWL = 2;
public static final int UPLOAD_VIDEO = 3;
public static final int UPLOAD_FILE = 4;
public static final int CATCH_IMAGE = 5;
public static final int LIST_FILE = 6;
public static final int LIST_IMAGE = 7;
mapping = new HashMap&String, Integer&(){{
put( "config", ActionMap.CONFIG );
put( "uploadimage", ActionMap.UPLOAD_IMAGE );
put( "uploadscrawl", ActionMap.UPLOAD_SCRAWL );
put( "uploadvideo", ActionMap.UPLOAD_VIDEO );
put( "uploadfile", ActionMap.UPLOAD_FILE );
put( "catchimage", ActionMap.CATCH_IMAGE );
put( "listfile", ActionMap.LIST_FILE );
put( "listimage", ActionMap.LIST_IMAGE );
public static int getType ( String key ) {
return ActionMap.mapping.get( key );
我想问一下,之前的ueditor版本是可以配置上传图片到项目外部路径么?????可以,现在得修改代码,但是有没有开源代码,之前是写在jsp里面的。
感谢前辈,受益匪浅过奖了,不知道解决你的问题了没有?
求源码ueditor-1.1.1.jar好的,我将反编译的上传下
浏览: 689319 次
来自: 北京
感觉LogManager打开了所有的LogSegment(文件 ...
大神 你好 我再使用ueditor 进行编辑的时候发现他会在我 ...项目适配iOS9遇到的一些问题及解决办法(更新两个小问题) - 简书
<div class="fixed-btn note-fixed-download" data-toggle="popover" data-placement="left" data-html="true" data-trigger="hover" data-content=''>
写了10862字,被827人关注,获得了628个喜欢
项目适配iOS9遇到的一些问题及解决办法(更新两个小问题)
1.网络请求报错。升级Xcode 7.0发现网络访问失败。输出错误信息
The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.
原因:iOS9引入了新特性App Transport Security (ATS)。详情:App Transport Security (ATS)新特性要求App内访问的网络必须使用HTTPS协议。但是现在公司的项目使用的是HTTP协议,使用私有加密方式保证数据安全。现在也不能马上改成HTTPS协议传输。最终找到以下解决办法:在Info.plist中添加NSAppTransportSecurity类型Dictionary。在NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES
2.Scheme白名单问题(无法判断手机是否安装微信等)
-canOpenURL: failed for URL: "weixin://app/wxdaae92a9cfe5d54c/" - error: "This app is not allowed to query for scheme weixin"
搜索后得知
近期苹果公司iOS 9系统策略更新,限制了http协议的访问,此外应用需要在“Info.plist”中将要使用的URL Schemes列为白名单,才可正常检查其他应用是否安装。
受此影响,当你的应用在iOS 9中需要使用微信SDK的相关能力(分享、收藏、支付、登录等)时,需要在“Info.plist”里增加如下代码:
注意:截图来自微信开放平台,里面已经包含第一个问题的解决
完成后需使用Xcode 7编译。
如果你在模拟器上运行可以能还会有以下报错:
-canOpenURL: failed for URL: "weixin://app/wxdaae92a9cfe5d54c/" - error: "(null)"
这是因为模拟器上并没有安装微信,如果运行到真机上就不会有报错了。
请注意:未升级到微信客户端6.2.5及以上版本的用户,在iOS 9下使用到微信相关功能时,仍可能无法成功。
下面整理一些常用的白名单
&key&LSApplicationQueriesSchemes&/key&
&string&mqqOpensdkSSoLogin&/string&
&string&mqzone&/string&
&string&sinaweibo&/string&
&string&alipayauth&/string&
&string&alipay&/string&
&string&safepay&/string&
&string&mqq&/string&
&string&mqqapi&/string&
&string&mqqopensdkapiV3&/string&
&string&mqqopensdkapiV2&/string&
&string&mqqapiwallet&/string&
&string&mqqwpa&/string&
&string&mqqbrowser&/string&
&string&wtloginmqq2&/string&
&string&weixin&/string&
&string&wechat&/string&
qq登录绑定,qq支付,qq分享微信支付,微信登录绑定新浪登录绑定支付宝支付,支付宝登录绑定
3.Bitcode问题(通俗解释:在线版安卓ART模式)报错如下
ld: warning: directory not found for option '-F/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/Developer/Library/Frameworks'ld: -bundle and -bitcode_bundle (Xcode setting ENABLE_BITCODE=YES) cannot be used togetherclang: error: linker command failed with exit code 1 (use -v to see invocation)
Bitcode报错
原因:Xcode7 及以上版本会默认开启 bitcode 。bitcode具体是什么就不解释了。
解决方法:1.更新library使包含Bitcode,否则会出现以上的警告。2.关闭Bitcode,简单粗暴。
Build Settings”-&”Enable Bitcode”改成"NO"。
4.项目运行报错如下
&Error&: CGContextSaveGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
&Error&: CGContextTranslateCTM: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
&Error&: CGContextRestoreGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
出错原因:设置app的状态栏样式的使用使用了旧的方式,在info.plist里面设置了View controller-based status bar appearance为NO,默认为YES,一般式iOS6的时候使用这种方式,iOS7,8也兼容,但是到了iOS9就报了警告。
[[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
以前我们通过上面代码改变状态了颜色,iOS9以后点进去看api发现如下说明
// Setting the statusBarStyle does nothing if your application is using the default UIViewController-based status bar system.
@property(readwrite, nonatomic) UIStatusBarStyle statusBarStyle NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController preferredStatusBarStyle]");
- (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle animated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController preferredStatusBarStyle]");
解决办法:修改方式将View controller-based status bar appearance设置为YES,然后使用新的方式来实现状态栏的样式。
- (UIStatusBarStyle)preferredStatusBarS
- (UIViewController *)childViewControllerForStatusBarS
- (void)setNeedsStatusBarAppearanceUpdate
更新5 directory not found for option问题
警告如下:
ld: warning: directory not found for option '-F/Applications/Xcode 7.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator9.0.sdk/Developer/Library/Frameworks'
问题原因:Xcode7将framworks位置改变了。
解决方法:点击项目,选择 Targets-&xxxTests选择build setting ,找到 Frameworks Search Path 或者 Library Search Paths 删除$(SDKROOT)/Developer/Library/Frameworks, 或者使用$(PLATFORM_DIR)/Developer/Library/Frameworks替换
framworks位置改变
暂时就这些,还有其他问题会继续更新如果你们还有其他问题请参考:
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
如果你是程序员,或者有一颗喜欢写程序的心,喜欢分享技术干货、项目经验、程序员日常囧事等等,欢迎投稿《程序员》专题。
专题主编:小...
· 257287人关注
玩转简书的第一步,从这个专题开始。
想上首页热门榜么?好内容想被更多人看到么?来投稿吧!如果被拒也不要灰心哦~入选文章会进一个队...
· 146375人关注
分享 iOS 开发的知识,解决大家遇到的问题,讨论iOS开发的前沿,欢迎大家投稿~
· 29177人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:关于需要apple ID激活的,我找到一个方法!_iphone4吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:464,115贴子:
关于需要apple ID激活的,我找到一个方法!收藏
经过千百次实验!我终于找到一个方法,工具爱思助手,红雪,6.13和6.0的官方固件!手机有6.13SHSH备份!用爱思助手刷6.13,刷机成功后打开itunes提示需要输入apple ID和密码才能激活手机,这个时候不用管它,打开红雪进行6.13不完美越狱(教程可以百度),越狱成功后打开itunes提示设备已经激活!设置你的iphone名称,同步书签等!这个时候还进不了手机主界面!不用管它!打开爱思助手进行不完美越狱引导!等引导完了就可以进入主界面了!不过还不能打电话,但是可以当个touch用!成功的支持一下哈!
没有人支持吗?)
我刷702和降613都直接跳过。
我没帐号也不想弄帐号
哪个工大?
没人试试吗
不能打电话有个毛用
换基带救活
touch是什么意思
我一直不知道啊 !
[国美在线]手机,全国联保,品牌行货,质量保证,放心之选.[国美在线]手机,7天免费退换货,更可门店自提,全网低价,39元全国低价包邮!
楼主,我亲测你的方法可行,已经进入界面,我想问下,我连接itunes提示已经激活,我也在icloud里输入了自己的appstore账户 若是再刷回6.1.3是不是输入自己的app账户,而不是那个不知道的账户?加我交流下吧!
6.12可以用爱思助手刷机过程中勾选直接越狱和跳过激活两个选项,这样刷机可以进入主界面!
楼主,怎么弄?
靠!换个基带不就完了。搞那么麻烦
激活文件全在lockdown.已测试可以来信号、在需要id的情况下
为何我按照楼主的 方法却无法进入主界面呢?
只要用红雪加入自己备份的激活证书
就有信号了
但没有推送
你说的是这个吧
反激活可以来信号
不用这么麻烦7.03直接跳过
这个可以直接 用爱思助手
然后刷机过程中直接越狱
但是不能接打电话 没有用,
我是花了500块大洋换基带的
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊A啊啊啊
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊A啊啊啊
楼主的帖子实在是写得太好了。文笔流畅,修辞得体,深得魏晋诸朝遗风,更将唐风宋骨发扬得入木三分,能在有生之年看见楼主的这个帖子。实在是我三生之幸啊。看完楼主的这个帖子之后,我竟产生出一种无以名之的悲痛感--啊,这么好的帖子,如果将来我再也看不到了,那我该怎么办?那我该怎么办?直到我毫不犹豫地把楼主的这个帖子收藏了,我内心的那种激动才逐渐平静下来。可是我立刻想到,这么好的帖子,倘若别人看不到,那么不是浪费楼主的心血吗?经过痛苦的思想斗争,我终于下定决心,牺牲小我,奉献大我。我要拿出这帖子奉献给世人赏阅,我要把这个帖子一直往上顶,往上顶!顶到所有人都看到为止!
目测很复杂 求大神
太牛了,支持,不知道5行不行
⊙▽⊙直接淘宝买个
这个怕是不行
iphone5行吗?
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或

我要回帖

更多关于 opentype字体下载 的文章

 

随机推荐