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