Загрузить файлы в SharePoint из приложения Java / J2EE - PullRequest
4 голосов
/ 24 января 2011

У нас есть требование загружать большие файлы (может быть до 200 МБ) в SharePoint из приложения Java / J2EE.

Мы знаем, что есть готовые веб-службы SharePoint, которые позволяют загружать файлыв SharePoint.Тем не менее, наша главная проблема заключается в том, что произойдет, если одновременно загружать файлы будут одновременно пользователи.Например, нам потребуется прочитать файл размером 200 МБ для каждого пользователя на сервере Java (сервере приложений), прежде чем вызывать SharePoint для отправки этих данных.Даже если одновременно работают 5 пользователей, потребляемая память будет составлять около 1 ГБ, а также может быть высокая загрузка ЦП.Есть ли какие-либо предложения, как обрабатывать память сервера, параллелизм загрузки файлов в этом сценарии?

Я думаю, что одним из вариантов может быть использование таких технологий, как Flash / Flex, для которых не требуется другой сервер (сервер приложений Java)между тем - однако, интересно, как этого можно добиться на сервере J2EE?

http://servername/sitename/_vti_bin/copy.asmx

Спасибо

Ответы [ 5 ]

1 голос
/ 24 мая 2016

вот решение

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import java.security.cert.CertificateException;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import javax.security.cert.X509Certificate;
import javax.xml.ws.Holder;
import org.apache.cxf.configuration.jsse.TLSClientParameters;
import org.apache.cxf.configuration.security.AuthorizationPolicy;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;

import com.microsoft.schemas.sharepoint.soap.copy.CopyResultCollection;
import com.microsoft.schemas.sharepoint.soap.copy.CopySoap;
import com.microsoft.schemas.sharepoint.soap.copy.DestinationUrlCollection;
import com.microsoft.schemas.sharepoint.soap.copy.FieldInformation;
import com.microsoft.schemas.sharepoint.soap.copy.FieldInformationCollection;
import com.microsoft.schemas.sharepoint.soap.copy.FieldType;

public class Upload {

    private static String username = "yourusrename";

    private static String password = "yourpassword";

    private static String targetPath = "https://www.yoursite.target/filename";

    private static String sourcePath = "file.txt";

    private static String portUrl = "https://www.yoursite.com/_vti_bin/Copy.asmx";

    private static CopySoap soapInstance;

    public static void main(String[] args) {
        activate();
        CopySoap sqs = getInstance();
        String url = targetPath;
        String sourceUrl = sourcePath;
        DestinationUrlCollection urls = new DestinationUrlCollection();
        urls.getString().add(url);
        File file = null;
        byte[] content = null;
        try {
            FileInputStream fileStream = new FileInputStream(file = new File(sourceUrl));

            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            byte[] buf = new byte[1024];

            for (int readNum; (readNum = fileStream.read(buf)) != -1;) {
                bos.write(buf, 0, readNum);
            }

            content = bos.toByteArray();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        FieldInformation titleInfo = new FieldInformation();
        titleInfo.setDisplayName("testpage");
        titleInfo.setType(FieldType.TEXT);
        titleInfo.setValue("Test Page");
        FieldInformationCollection infos = new FieldInformationCollection();
        infos.getFieldInformation().add(titleInfo);
        CopyResultCollection results = new CopyResultCollection();
        Holder<CopyResultCollection> resultHolder = new Holder<CopyResultCollection>(results);
        Holder<Long> longHolder = new Holder<Long>(new Long(-1));
        if (content != null) {
            sqs.copyIntoItems(sourceUrl, urls, infos, content, longHolder, resultHolder);
        }
    }

    private static void activate() {

        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        factory.setServiceClass(CopySoap.class);
        factory.setAddress(portUrl);
        factory.getInInterceptors().add(new LoggingInInterceptor());
        factory.getOutInterceptors().add(new LoggingOutInterceptor());
        soapInstance = (CopySoap) factory.create();
        Authenticator.setDefault(new SPAuthenticator());
        Client client = ClientProxy.getClient(soapInstance);
        HTTPConduit http = (HTTPConduit) client.getConduit();
        HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
        httpClientPolicy.setConnectionTimeout(10000);
        httpClientPolicy.setAllowChunking(false);
        HTTPConduit conduit = (HTTPConduit) client.getConduit();
        conduit.setClient(httpClientPolicy);
        TLSClientParameters tcp = new TLSClientParameters();
        tcp.setTrustManagers(new TrustManager[] { (TrustManager) new TrustAllX509TrustManager() });
        conduit.setTlsClientParameters(tcp);
    }

    public static CopySoap getInstance() {
        return soapInstance;
    }

    static class SPAuthenticator extends Authenticator {
        public PasswordAuthentication getPasswordAuthentication() {
            System.out.println("hitting SP with username and password for " + getRequestingScheme());
            return (new PasswordAuthentication(username, password.toCharArray()));
        }
    }

    /**
     * This class allow any X509 certificates to be used to authenticate the
     * remote side of a secure socket, including self-signed certificates.
     */
    public static class TrustAllX509TrustManager implements X509TrustManager {

        /** Empty array of certificate authority certificates. */
        private static final X509Certificate[] acceptedIssuers = new X509Certificate[] {};

        /**
         * Always trust for client SSL chain peer certificate chain with any
         * authType authentication types.
         * 
         * @param chain
         *            the peer certificate chain.
         * @param authType`enter
         *            code here` the authentication type based on the client
         *            certificate.
         */
        public void checkClientTrusted(X509Certificate[] chain, String authType) {
        }

        /**
         * Always trust for server SSL chain peer certificate chain with any
         * authType exchange algorithm types.
         * 
         * @param chain
         *            the peer certificate chain.
         * @param authType
         *            the key exchange algorithm used.
         */
        public void checkServerTrusted(X509Certificate[] chain, String authType) {
        }

        /**
         * Return an empty array of certificate authority certificates which are
         * trusted for authenticating peers.
         * 
         * @return a empty array of issuer certificates.
         */
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null;
        }

        @Override
        public void checkClientTrusted(java.security.cert.X509Certificate[] arg0, String arg1)
                throws CertificateException {
            // TODO Auto-generated method stub

        }

        @Override
        public void checkServerTrusted(java.security.cert.X509Certificate[] arg0, String arg1)
                throws CertificateException {
            // TODO Auto-generated method stub

        }
    }
}
1 голос
/ 06 февраля 2011

хорошо .. вот что я понял:

  • Вы пытаетесь использовать Служба копирования Sharepoint
  • И этот сервис требует, чтобы поток был закодирован в base64 в конверте Soap.
  • Поскольку размер файла огромен, ваш размер SOAP-запроса становится огромным и требует больше памяти

Я могу придумать 2 варианта:

  1. Я не знаю много о sharepoint, если можно указать местоположение файла для загрузки, чем отправка байтов, тогда вы можете ftp / sftp файл на сервер sharepoint и затем вызвать веб-сервис с указанием местоположения файл.

  2. В Java вместо использования готового API для сообщений SOAP напишите пользовательский API. Когда пользователь загрузит файл, сохраните его как файл в кодировке base64. И тогда ваш пользовательский API создаст мыльное сообщение и передаст его вместо загрузки всего в память.

Для варианта 2: попробуйте отправить файл в виде мыльного вложения. он становится немного сложным, если вы хотите отправить его как часть сообщения.

Попробуйте. Я не уверен, работает ли.

1 голос
/ 14 марта 2011

SharePoint поддерживает протокол WebDAV для чтения / записи файлов.

Вы можете использовать множество библиотек WebDAV, которые не требуют загрузки полного файла в память.

0 голосов
/ 27 января 2018

или взять объект, взять

@Autowired
ServletContext c;


            byte[] bytes = file.getBytes();

             String UPLOAD_FOLDEdR=c.getRealPath("/images");     
            Path path = Paths.get(UPLOAD_FOLDEdR+"/"+file.getOriginalFilename());
            Files.write(path, bytes);
            String Pic_Name =file.getOriginalFilename() ;
0 голосов
/ 03 февраля 2011

Может быть, я что-то упустил ... но когда вы позволяете пользователям загружать файлы на ваш J2EE-сервер, вы не будете сначала записывать загруженный контент во временный каталог, а затем передавать его на сервер?

При немедленной записи буферов на диск проблем с ограничением памяти не будет.

...