Загрузка файла Axis2 по частям

Я пытаюсь загрузить файл с помощью веб-службы Axis2 размером 1024 фрагмента.

Моя серверная часть выглядит так:

public void appendChunk(int count, byte[] buffer){
    FileOutputStream fos = null;
     try {
         File destinationFile = new File("c:\\file1.exe");
        fos = new FileOutputStream(destinationFile,true);
        fos.write(buffer,0, count);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    finally{
        try {
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

моя клиентская сторона выглядит так:

static int CHUNK_SIZE =1024;
public static void main(String[] args) throws IOException, ServiceException {
    FileUploadService strub = new FileUploadServiceLocator();
    FileUploadServicePortType a = strub.getFileUploadServiceHttpSoap12Endpoint();
    byte[] buffer = new byte[CHUNK_SIZE];
    FileInputStream fis = null;
    File file = new File("C:\\install.exe");
    int count;
    try {
         fis =  new FileInputStream(file);
        while((count = fis.read(buffer, 0, CHUNK_SIZE)) >0 )
        {
            a.appendChunk(count, buffer);
        }   
        } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
        finally{
            fis.close();
        }
}

После этого размер файла неправильный, и если исходный размер файла составляет 500 КБ, исходный размер варьируется от 200 до 400 КБ.

Что я делаю неправильно?

Обновление: я просмотрел файл log4j в Tomcat.

Nov 17, 2010 2:08:31 PM org.apache.tomcat.util.net.JIoEndpoint createWorkerThread
INFO: Maximum number of threads (200) created for connector with address null and port 80

Похоже, что все запросы к веб-серверу выполняются асинхронно, и я также получаю исключение ввода-вывода о том, что файл используется другим процессом.


person danny.lesnik    schedule 17.11.2010    source источник
comment
Есть ли конкретная причина, по которой вы используете для этого веб-сервисы? Это будет иметь очень высокие накладные расходы, поскольку ваши данные будут преобразованы в base64 до того, как будут встроены в xml, каждый фрагмент, вероятно, также будет использовать новое TCP-соединение. Почему бы вместо этого не использовать простой HTTP-запрос к сервлету?   -  person Jörn Horstmann    schedule 17.11.2010
comment
Привет, К сожалению, есть причина, у меня есть сторонний клиент, который загружает двоичные данные таким образом :( и мне придется написать веб-службу, которая будет совместима с этим клиентом. Я понимаю, что у меня будут проблемы с производительностью со всеми заголовками SOAP , но мне, честно говоря, все равно.   -  person danny.lesnik    schedule 17.11.2010


Ответы (1)


попробуйте добавить fos.flush(); перед fos.close(); в реализации вашего сервера.

Изменять

while((count = fis.read(buffer, 0, CHUNK_SIZE)) >0 )

для

while((count = fis.read(buffer, 0, CHUNK_SIZE)) != -1 )
person EricParis16    schedule 26.05.2011