1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/feiser-WifiTransfer

В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Передача файлов через Wi-Fi

Вдохновленная функцией передачи файлов через Wi-Fi в приложении Duokan, реализована следующая функциональность:

  • Для мобильного приложения используется открытый проект AndroidAsync для реализации HTTP-сервера.
  • Для веб-версии используется jQuery, а также Upload5 для HTML5-браузеров и ajaxupload.js для не-HTML5 браузеров (например, IE7/IE8/IE9).

Скриншоты для мобильного приложения

Скриншоты для веб-версии

Основные моменты реализации HTTP-сервера с использованием AndroidAsync

AndroidAsync предоставляет мало документации по модулю HTTP-сервера, поэтому необходимо изучать исходный код. В данном проекте функциональность HTTP-сервера реализована в файле WebService.java. Ниже приведены некоторые ключевые API, используемые в проекте:

  • Получение тела запроса типа x-www-form-urlencoded
UrlEncodedFormBody body = (UrlEncodedFormBody) request.getBody();
  • Получение тела запроса типа multipart/form-data
MultipartFormDataBody body = (MultipartFormDataBody) request.getBody();
  • Отправка текста
response.send("Hello world!");
  • Отправка потока файла
BufferedInputStream bInputStream = ...
response.sendStream(bInputStream, bInputStream.available());
response.sendFile(...);
``` * Отправка JSON

```java
response.send(new JSONObject());
  • Отправка заголовков
response.getHeaders().add("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "utf-8"));
  • Отправка специфического кода ответа
response.code(500); // этот код должен использоваться вместе с send() или end()
```## Реализация функции загрузки файлов HTTP-сервером для передачи файлов через Wi-Fi```java
server.post("/files", (AsyncHttpServerRequest request, AsyncHttpServerResponse response) -> {
    final MultipartFormDataBody body = (MultipartFormDataBody) request.getBody();
    body.setMultipartCallback((Part part) -> {
        if (part.isFile()) {
            body.setDataCallback((DataEmitter emitter, ByteBufferList bb) -> {
                fileUploadHolder.write(bb.getAllByteArray());
                bb.recycle();
            });
        } else {
            if (body.getDataCallback() == null) {
                body.setDataCallback((DataEmitter emitter, ByteBufferList bb) -> {
                    try {
                        String fileName = URLDecoder.decode(new String(bb.getAllByteArray()), "UTF-8");
                        fileUploadHolder.setFileName(fileName);
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }
                    bb.recycle();
                });
            }
        }
    });
    request.setEndCallback((Exception e) -> {
        fileUploadHolder.reset();
        response.end();
        RxBus.get().post(Constants.RxBusEventType.LOAD_BOOK_LIST, 0);
    });
});
```* Здесь загрузка состоит из 2 частей: имя файла и содержимое файла. Использование части с именем файла необходимо для поддержки кириллических имен файлов: при загрузке файлов с помощью multipart/form-data кириллические имена файлов могут быть отображены некорректно из-за использования ASCII-кодировки библиотекой AndroidAsync. Поэтому добавлена дополнительная часть с именем файла, содержимое которой представляет собой закодированное имя файла с помощью encodeURL на стороне JavaScript, а на стороне сервера имя файла декодируется с помощью URLDecoder.decode.* Здесь используются три обратных вызова: MultipartCallback, DataCallback и CompletedCallback. Библиотека AndroidAsync использует NIO, поэтому при обработке тела запроса: для каждого нового раздела вызывается обратный вызов MultipartCallback; содержимое файла получается через несколько вызовов DataCallback; после обработки всего тела запроса вызывается CompletedCallback, что означает, что все данные запроса были получены и можно отправить ответ клиенту, например, с помощью response.end() завершить запрос.

## TODO
Из-за использования NIO в AndroidAsync, на данный момент неизвестно, как получить размер загружаемого файла. При использовании не-HTML5 браузеров (например, IE7/IE8/IE9), прогресс загрузки файла отображается некорректно.

## Заявление об авторских правах
Этот проект реализован на основе проекта "Duokan", ресурсы на стороне веба взяты из "Duokan" и немного изменены. Использование для коммерческих целей запрещено, проект предназначен только для учебных и исследовательских целей. В противном случае последствия несут сам пользователь.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Передача книг по Wi-Fi, с использованием функции передачи книг по Wi-Fi из приложения «Duokan». HttpServer реализован с использованием AndroidAsync. Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/feiser-WifiTransfer.git
git@api.gitlife.ru:oschina-mirror/feiser-WifiTransfer.git
oschina-mirror
feiser-WifiTransfer
feiser-WifiTransfer
master