Open gelosie opened 9 years ago
花了一晚测试了下,并阅读了你的代码。可作为一个DEMO 探讨,但不是一个可用方案。
总的来说,你的方案是使用 ueditor 上传到自己的服务再转存 七牛,这个不是直接的实现。
另外:
public static void uploadFile(String path, String file) {
try {
uploadManager.put(file, path, uptoken);
} catch (QiniuException var3) {
var3.printStackTrace();
}
}
并没有跟踪上传结果,直接返回地址,若 自己的服务和七牛之间出了问题,跟本没办法收到反馈。
比如:
com.qiniu.common.QiniuException
at com.qiniu.http.Client.send(Client.java:192)
at com.qiniu.http.Client.multipartPost(Client.java:165)
at com.qiniu.http.Client.multipartPost(Client.java:144)
at com.qiniu.storage.FormUploader.upload(FormUploader.java:53)
at com.qiniu.storage.UploadManager.put(UploadManager.java:183)
at com.qiniu.storage.UploadManager.put(UploadManager.java:151)
at com.qiniu.storage.UploadManager.put(UploadManager.java:136)
at com.baidu.ueditor.util.QQiNiuUtil.uploadFile(QQiNiuUtil.java:38)
at com.baidu.ueditor.upload.StorageManager.saveTmpFile(StorageManager.java:139)
at com.baidu.ueditor.upload.StorageManager.saveFileByInputStream(StorageManager.java:75)
at com.baidu.ueditor.upload.BinaryUploader.save(BinaryUploader.java:75)
at com.baidu.ueditor.upload.Uploader.doExec(Uploader.java:24)
at com.baidu.ueditor.ActionEnter.invoke(ActionEnter.java:80)
at com.baidu.ueditor.ActionEnter.exec(ActionEnter.java:49)
at _jsp._ueditor._jsp._controller__jsp._jspService(_controller__jsp.java:63)
at _jsp._ueditor._jsp._controller__jsp._jspService(_controller__jsp.java:30)
at com.caucho.jsp.JavaPage.service(JavaPage.java:64)
at com.caucho.jsp.Page.pageservice(Page.java:548)
at com.caucho.server.dispatch.PageFilterChain.doFilter(PageFilterChain.java:194)
at com.caucho.filters.GzipFilter.doFilter(GzipFilter.java:166)
at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:156)
at com.caucho.server.webapp.AccessLogFilterChain.doFilter(AccessLogFilterChain.java:95)
at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:289)
at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:838)
at com.caucho.network.listen.TcpSocketLink.dispatchRequest(TcpSocketLink.java:1349)
at com.caucho.network.listen.TcpSocketLink.handleRequest(TcpSocketLink.java:1305)
at com.caucho.network.listen.TcpSocketLink.handleRequestsImpl(TcpSocketLink.java:1289)
at com.caucho.network.listen.TcpSocketLink.handleRequests(TcpSocketLink.java:1197)
at com.caucho.network.listen.TcpSocketLink.handleAcceptTaskImpl(TcpSocketLink.java:993)
at com.caucho.network.listen.ConnectionTask.runThread(ConnectionTask.java:117)
at com.caucho.network.listen.ConnectionTask.run(ConnectionTask.java:93)
at com.caucho.network.listen.SocketLinkThreadLauncher.handleTasks(SocketLinkThreadLauncher.java:169)
at com.caucho.network.listen.TcpSocketAcceptThread.run(TcpSocketAcceptThread.java:61)
at com.caucho.env.thread2.ResinThread2.runTasks(ResinThread2.java:173)
at com.caucho.env.thread2.ResinThread2.run(ResinThread2.java:118)
结论,可以作为一个 DEMO 探讨,根本不可能用在生产环境中。
你好,修改了ueditor的源码, 通过配置文件配置,local的话直接上传到服务器,qiniu的话上传到七牛云, 并没有先上传到服务器然后转存七牛云, 只是服务器获取文件流,然后直接上传七牛云。
另外,这个方案已经在生产环境中使用,如果你有更好的方法,可以修改源码然后push上来。多谢。
在生产环境中使用没有遇到问题?
目前没有遇到问题,有空我在研究下吧。
嗯,关于上传流程方面,我深入还不是很细。
但是: QQiNiuUtil.java 中 处理 uploadToken 的逻辑,会遇到 七牛授权超时的问题。
Auth.create(ak, sk).uploadToken(bucket)
这个默认是 3600 s 的,部署后,一个小时,就不可用了。返回一个地址,但是七牛上没有资源。 所以,你要添加一个refresh token的机制。
好的,token这个我可以改改,之前的版本好像没有这个限制~
重新看了一遍,貌似我采用的简单上传没有时间限制?
一个修改用来作评估的版本。现在觉得更好的做法是,进行二次开发,不修改 ueditor 的代码。重构建UI,以便使用七牛的图片数据处理。
package com.baidu.ueditor.util;
import com.qiniu.common.QiniuException;
import com.qiniu.storage.UploadManager;
import com.qiniu.util.Auth;
import java.util.Date;
/**
* 七牛云工具类<br>
* 1.上传文件<br>
* @author qiaowenbin
* @version 0.0.1.20141209
* @history
* 0.0.1.20141209<br>
*/
public class QQiNiuUtil {
private static class SingletonHolder {
private static final QQiNiuUtil INSTANCE = new QQiNiuUtil();
}
public static final QQiNiuUtil getInstance() {
return SingletonHolder.INSTANCE;
}
private QQiNiuUtil (){
uploadManager = new UploadManager();
ak = QPropertiesUtil.config.getProperty("qiniu.ak");
sk = QPropertiesUtil.config.getProperty("qiniu.sk");
bucket = QPropertiesUtil.config.getProperty("qiniu.bucket");
this.auth = Auth.create(this.ak, this.sk);
refreshUploadTokenIfNeed();
}
private UploadManager uploadManager;
private String ak;
private String sk;
private String bucket;
private Auth auth;
private String upToken;
private Date refreshUpTokenTime;
private void refreshUploadTokenIfNeed(){
if(this.refreshUpTokenTime == null){
this.upToken = this.auth.uploadToken(this.bucket);
this.refreshUpTokenTime = new Date();
}else{
Date now = new Date();
if(now.getTime() - this.refreshUpTokenTime.getTime() > 20*60*1000){ // 20 分钟 refresh token
this.upToken = this.auth.uploadToken(this.bucket);
this.refreshUpTokenTime = new Date();
}
}
}
private void upFile(String path, String file){
refreshUploadTokenIfNeed();
try {
this.uploadManager.put(file,path,upToken);
} catch (QiniuException e) {
e.printStackTrace();
}
}
/**
* 上传文件
* @param path
* @param file
*/
public static void uploadFile(String path, String file){
QQiNiuUtil.getInstance().upFile(path,file);
}
}
好的看到了,之前只看了下官方sdk说明,没有看源码。
jfinal部分只是让项目跑起来,简单小巧方便,和ueditor上传七牛云关系不大,可以自行替换。
嗯,了解。
Thank you for your work.
你好,添加了一个线程去定时获取uptoken,你看看可以不。
哪个部分依赖了jfinal?使用 java ee 的话, spring 配置更通常呀?