用edoc2实现上传和下载

Posted yangxiaobo-blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用edoc2实现上传和下载相关的知识,希望对你有一定的参考价值。

import cn.com.dyg.work.common.exception.DefException;
import cn.com.dyg.work.common.http.HttpClientRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.net.InetAddress;
import java.net.URI;
import java.net.UnknownHostException;
import java.util.*;

@Component
public class FileUploadAndDownloadUtil {
    private static Logger logger = LoggerFactory.getLogger(FileUploadAndDownloadUtil.class);
    /**
     * edoc2的url
     */
    private static String baseUrl;
    /**
     * 集成登录密钥
     */
    private static String integrationKey;
    /**
     * 登录用户名
     */
    private static String loginName;
    /**
     * folderId 上传文件及下载文件关联的文件夹的id
     */
    private static String folderId;
    /*用户凭证*/
    private static String token;

    /*登录*/
    private static synchronized String CheckAndLogin() {
        logger.info("CheckAndLogin......");
        if (StringUtils.isEmpty(token))
            return login();
        boolean isEffective = checkToken();
        if (isEffective)
            return token;
        else
            return login();
    }

    /*登录*/
    private static String login() {
        String regionUrl = baseUrl + "/api/services/org/UserLoginIntegrationByUserLoginName";
        HttpClientRequest req = HttpClientRequest.newInstance();
        JSONObject obj = new JSONObject();
        obj.put("loginName", loginName);
        obj.put("ipAddress", getLocalHost());
        obj.put("integrationKey", integrationKey);
        String result = req.postJson(regionUrl, obj.toJSONString());
        logger.info("login:" + result);
        JSONObject obj_result = JSON.parseObject(result);
        token = obj_result.get("data").toString();
        return token;
    }

    /**
     * 检查token是否有效
     *
     * @return boolean
     */
    private static boolean checkToken() {
        String url = baseUrl + "/api/services/Org/CheckUserTokenValidity?token=" + token;
        HttpClientRequest req = HttpClientRequest.newInstance();
        String result = req.get(url);
        logger.info("checkToken:" + result);
        JSONObject obj_result = JSON.parseObject(result);
        boolean isContain = obj_result.containsKey("data");
        if (!isContain)
            return false;
        return obj_result.getBoolean("data");
    }

    /**
     * 下载
     *
     * @param fileId 文件id
     * @return 响应
     * @throws IOException 异常
     */
    public static HttpResponse download(String fileId) throws IOException, InterruptedException {
        String token = CheckAndLogin();

        String url = baseUrl + "/DownLoad/DownLoadCheck?token=" + token + "&fileIds=" + fileId;
        HttpClientRequest req = HttpClientRequest.newInstance();
        String result = req.get(url);
        logger.info("downLoadCheck: {}", result);

        JSONObject obj_result = JSON.parseObject(result);
        String blockurl;
        /*除了0都是有问题*/
        if (obj_result.getInteger("nResult") == 0) {
            blockurl = baseUrl + "/downLoad/index?regionHash=" + obj_result.get("RegionHash") + "&async=false&token=" + token;
        } else {
            throw new DefException(obj_result.getString("msg"));
        }

        // 获得Http客户端(可以理解为:你得先有一个浏览器;注意:实际上HttpClient与浏览器是不一样的)
        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        // 创建Get请求
        HttpGet httpGet = new HttpGet(blockurl);

        // 响应模型
        // 由客户端执行(发送)Get请求
        CloseableHttpResponse response1 = httpClient.execute(httpGet);
        logger.info("downLoad: {}", blockurl);
        return response1;
    }


    /**
     * 上传文件,这个和upload2是用的两种不同的方式来上传文件
     *
     * @param file 文件
     * @return 返回上传的文件的相关的信息
     * @throws IOException 异常
     */
    public static String upload(MultipartFile file, String newfilenameString) throws IOException, InterruptedException {
        String token = CheckAndLogin();
        byte[] b = file.getBytes();
        int filesize = b.length;

        String UploadId = UUID.randomUUID().toString();
        JSONObject obj = new JSONObject();
        obj.put("UploadId", UploadId);
        /*15是个人文件夹的ParentId ,1044是crm文件管理*/
        obj.put("ParentId", folderId);
        obj.put("fileSize", filesize);
        obj.put("name", newfilenameString);
        obj.put("Token", token);
        /*第一次请求*/
        HttpClientRequest req = HttpClientRequest.newInstance();
        String url = baseUrl + "/api/services/Transfer/StartUploadFile";
        String json = req.postJson(url, obj.toString());
        logger.info("StartUploadFile:" + json);


        JSONObject obj_result = JSON.parseObject(json);
        String blockurl;
        /*除了0都是有问题*/
        if (obj_result.getInteger("Result") == 0) {
            if (obj_result.getInteger("RegionId") == 1) {
                blockurl = baseUrl + "/api/services/Transfer/UploadFileBlock";
            } else {
                blockurl = obj_result.getString("RegionUrl");
            }
        } else {
            throw new DefException(obj_result.getString("Message"));
        }


        int buffer = 819216;
        int smallData = filesize % buffer;
        int blockNum = filesize / buffer == 0 ? 1 : filesize / buffer;
        try (InputStream bais = file.getInputStream()) {
            for (int i = 0; i <= blockNum; i++) {
                byte[] buffers = new byte[buffer];

                //noinspection ResultOfMethodCallIgnored
                bais.read(buffers);
                String base64 = Base64.getEncoder().encodeToString(buffers);
                JSONObject obj_block = new JSONObject();
                obj_block.put("Token", token);
                obj_block.put("dataSize", (i == blockNum ? smallData : buffer));
                obj_block.put("FilePos", i * buffer);
                obj_block.put("RegionHash", obj_result.getString("RegionHash"));
                obj_block.put("BlockData", base64);
                obj_block.put("uploadId", UploadId);
                /*传输数据*/
                String result_block = req.postJson(blockurl, obj_block.toJSONString());
                logger.info("UploadFileBlock:" + result_block);
            }
        } catch (Exception e) {
            throw new DefException("传输文件错误。");
        }
        String endurl = baseUrl + "/api/services/Transfer/EndUploadFile";
        JSONObject obj_end = new JSONObject();
        obj_end.put("Token", token);
        obj_end.put("uploadId", UploadId);
        obj_end.put("RegionHash", obj_result.getString("RegionHash"));
        /*结束传输请求*/
        String end_block = req.postJson(endurl, obj_end.toJSONString());
        logger.info(end_block);
        return obj_result.getString("FileId");
    }


    /**
     * 上传文件
     *
     * @param file              文件
     * @param newfilenameString 新名字
     * @return 返回上传的文件id
     * @throws IOException 异常
     */
    public static String upload2(MultipartFile file, String newfilenameString) throws IOException, InterruptedException {
        String token = CheckAndLogin();
        byte[] b = file.getBytes();
        int filesize = b.length;

        String uploadId = UUID.randomUUID().toString();
        String url = baseUrl + "/WebCore";

        CloseableHttpClient httpclient = HttpClients.createDefault();
        CloseableHttpResponse response;
        HttpPost post = new HttpPost(url);
        HttpEntity formEntity;

        List<NameValuePair> formParams = new ArrayList<>();
        formParams.add(new BasicNameValuePair("fileSize", "" + filesize));
        formParams.add(new BasicNameValuePair("folderId", folderId));
        formParams.add(new BasicNameValuePair("fileName", newfilenameString));
        formParams.add(new BasicNameValuePair("module", "RegionDocOperationApi"));
        formParams.add(new BasicNameValuePair("fun", "CheckAndCreateDocInfo"));
        formParams.add(new BasicNameValuePair("type", file.getContentType()));
        formParams.add(new BasicNameValuePair("size", "" + file.getSize()));
        formParams.add(new BasicNameValuePair("attachType", "0"));
        formParams.add(new BasicNameValuePair("fileModel", "UPLOAD"));
        formParams.add(new BasicNameValuePair("token", token));


        formEntity = new UrlEncodedFormEntity(formParams, "UTF-8");
        post.setEntity(formEntity);
        response = httpclient.execute(post);
        HttpEntity entity = response.getEntity();
        JSONObject str = JSON.parseObject(EntityUtils.toString(entity, "UTF-8"));

        logger.info(str.toJSONString());
        if (str.getIntValue("result") != 0)
            throw new DefException(str.getString("reason"));

        String blockurl = baseUrl + "/document/upload?token=" + token;

        /*注意:chunkSize不可以过大,否则会导致文件损坏*/
        int chunkSize = 1024 * 1024 * 3;
        int chunks = filesize / chunkSize == 0 ? 1 : filesize / chunkSize + 1;
        int smallData = filesize % chunkSize;
        try (InputStream ins = file.getInputStream()) {
            for (int i = 0; i < chunks; i++) {
                MultipartEntityBuilder builder = MultipartEntityBuilder.create();
                builder.addTextBody("id", uploadId);
                builder.addTextBody("name", newfilenameString);
                builder.addTextBody("type", file.getContentType());
                builder.addTextBody("lastModifiedDate", new Date().toString());
                builder.addTextBody("size", "" + file.getSize());
                builder.addTextBody("chunks", "" + chunks);
                builder.addTextBody("chunk", "" + i);
                builder.addTextBody("fileName", newfilenameString);
                builder.addTextBody("blockSize", "" + (i + 1 == chunks ? smallData : chunkSize));
                builder.addTextBody("chunkSize", "" + chunkSize);
                builder.addTextBody("uploadId", uploadId);
                builder.addTextBody("regionId", str.getJSONObject("data").getString("RegionId"));
                builder.addTextBody("regionHash", str.getJSONObject("data").getString("RegionHash"));

                byte[] bytes = new byte[chunkSize];//每次读取文件的大小为5MB
                //noinspection ResultOfMethodCallIgnored
                ins.read(bytes);

                File tempfile = new File(String.valueOf(0));
                FileOutputStream temfileStream = new FileOutputStream(tempfile);
                temfileStream.write(bytes);
                builder.addBinaryBody("file", tempfile);
                // 把文件加到HTTP的post请求中
//            builder.addBinaryBody("file", bytes, ContentType.APPLICATION_OCTET_STREAM, file.getOriginalFilename());
                post.setURI(URI.create(blockurl));
                HttpEntity multipart = builder.build();
                post.setEntity(multipart);
                temfileStream.close();
                response = httpclient.execute(post);
                HttpEntity responseEntity = response.getEntity();
                String sResponse = EntityUtils.toString(responseEntity, "UTF-8");
                logger.info(sResponse);
            }
        }
        return str.getJSONObject("data").getString("FileId");
    }


    /**
     * @return 预览的url
     */
    public static String getPreViewUrl() throws InterruptedException {
        String token = FileUploadAndDownloadUtil.CheckAndLogin();
        return baseUrl + "/jump.html?token=" + token + "&returnUrl=http://192.168.20.194/preview.html?fileid=1082";
    }

    @Value("${EDOC2_BASE_URL}")
    public void setBaseUrl(String baseUrl) {
        FileUploadAndDownloadUtil.baseUrl = baseUrl;
    }

    @Value("${INTEGRATIONKEY}")
    public void setIntegrationKey(String integrationKey) {
        FileUploadAndDownloadUtil.integrationKey = integrationKey;
    }

    @Value("${EDOC2_LOGIN_NAME}")
    public void setLoginName(String loginName) {
        FileUploadAndDownloadUtil.loginName = loginName;
    }

    @Value("${EDOC2_FOLDER_ID}")
    public void setFolderId(String folderId) {
        FileUploadAndDownloadUtil.folderId = folderId;
    }

    /**
     * 获取本地的ip
     *
     * @return ip
     */
    private static String getLocalHost() {
        try {
            return InetAddress.getLocalHost().getHostAddress();
        } catch (UnknownHostException e) {
            e.printStackTrace();
            throw new DefException("找不到HostAddress。");
        }
    }
}

 

以上是关于用edoc2实现上传和下载的主要内容,如果未能解决你的问题,请参考以下文章

用于从 cloudkit 检索单列的代码模式/片段

怎么用http协议实现安卓数据

c#使用FluentFtp实现一行代码实现ftp上传下载等

c#使用FluentFtp实现一行代码实现ftp上传下载等

用Java的三大框架实现文件的上传下载,求代码啊,最好是分为action,service,serv

怎么用Java实现FTP上传