uikoo9 / ueditor-java-qiniu

ueditor上传文件到七牛云java实现版
http://uikoo9.com
MIT License
22 stars 15 forks source link

需要重构成一个可用的方案。此方案不可用于生产环境。 #1

Open gelosie opened 9 years ago

gelosie commented 9 years ago

哪个部分依赖了jfinal?使用 java ee 的话, spring 配置更通常呀?

gelosie commented 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 探讨,根本不可能用在生产环境中。

uikoo9 commented 9 years ago

你好,修改了ueditor的源码, 通过配置文件配置,local的话直接上传到服务器,qiniu的话上传到七牛云, 并没有先上传到服务器然后转存七牛云, 只是服务器获取文件流,然后直接上传七牛云。

uikoo9 commented 9 years ago

另外,这个方案已经在生产环境中使用,如果你有更好的方法,可以修改源码然后push上来。多谢。

gelosie commented 9 years ago

在生产环境中使用没有遇到问题?

uikoo9 commented 9 years ago

目前没有遇到问题,有空我在研究下吧。

gelosie commented 9 years ago

嗯,关于上传流程方面,我深入还不是很细。

但是: QQiNiuUtil.java 中 处理 uploadToken 的逻辑,会遇到 七牛授权超时的问题。

Auth.create(ak, sk).uploadToken(bucket)

这个默认是 3600 s 的,部署后,一个小时,就不可用了。返回一个地址,但是七牛上没有资源。 所以,你要添加一个refresh token的机制。

uikoo9 commented 9 years ago

好的,token这个我可以改改,之前的版本好像没有这个限制~

uikoo9 commented 9 years ago

重新看了一遍,貌似我采用的简单上传没有时间限制?

gelosie commented 9 years ago

一个修改用来作评估的版本。现在觉得更好的做法是,进行二次开发,不修改 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);
    }

}
gelosie commented 9 years ago

https://github.com/qiniu/java-sdk/blob/b3b0f4db267873d0814e5092f5684b0f4e8bce30/src/main/java/com/qiniu/util/Auth.java

line 200 到 line 300

uikoo9 commented 9 years ago

好的看到了,之前只看了下官方sdk说明,没有看源码。

uikoo9 commented 9 years ago

jfinal部分只是让项目跑起来,简单小巧方便,和ueditor上传七牛云关系不大,可以自行替换。

gelosie commented 9 years ago

嗯,了解。

Thank you for your work.

uikoo9 commented 9 years ago

你好,添加了一个线程去定时获取uptoken,你看看可以不。