@PutChild Не удалось загрузить файл с помощью milton webdav в Mac Finder

Я использую milton, и мой код загрузки выглядит следующим образом:

@PutChild 
@Transactional 
public FileContentItem uploadFile(FolderContentItem parent, String name, byte[] bytes){
 String traceId = UuidGenUtil.createUuid();
 try { 
     QUERY_LOGGER.info("[uploadFile][NetdiskController],action=Request, name={}, size={},traceId={}",name,bytes.length,traceId);

В Windows я могу успешно загрузить файл, но с Mac Finder длина байтов всегда равна 0, а ошибка выглядит следующим образом:

The Finder can't complete the operation because some data in "Shot.png" can't be read or written (Error code -36)

Кто-нибудь знает, почему? Спасибо

Обновление: я пробую клиент ForkLift webdav на Mac и могу успешно загрузить файл


person chou    schedule 28.11.2017    source источник


Ответы (1)


Проблема в том, что mac finder отправляет первый запрос на создание нового файла без какого-либо байта

После этого - вызовите LOCK, который не доступен для Dav Level 1, поэтому у вас плохой ответ от сервера, и mac перестает загружать файл. Этот метод доступен только для уровня Dav 2, поэтому вам необходимо получить корпоративную лицензию milton, чтобы он работал.

После блокировки объекта Finder загружает файл

После - вызывает метод UNLOCK

Итак, если вы хотите использовать Mac Finder для webdav в Милтоне, у вас есть несколько вариантов:

  1. Получите пробную корпоративную лицензию и изучите этот пример:https://github.com/miltonio/milton2/tree/master/examples/milton-anno-ref

  2. Реализуйте эти методы самостоятельно по спецификациям webdav.

  3. Смоделируйте его — расширьте MiltonFilter или загляните в MyOwnServlet в примере и в методе doFilter/service напишите что-то вроде этого:

    //mock method, do not use it in production!
    HttpServletRequest request = (HttpServletRequest)req;
    HttpServletResponse response = (HttpServletResponse) resp;
    if(request.getMethod().equals("LOCK")){
        response.setStatus(200);
        response.addHeader("Lock-Token", "<opaquelocktoken:e71d4fae-5dec-22d6-fea5-00a0c91e6be4>");
    } else if(request.getMethod().equals("UNLOCK")){
        response.setStatus(204);
    }else {
        doMiltonProcessing((HttpServletRequest) req, (HttpServletResponse) resp);
    }
    

Я проверил этот код, работающий в примере по ссылке выше: создайте метод web.xml, обслуживаемый MyOwnServlet, отключите аутентификацию в init, внедрив пустой менеджер безопасности, установите пакеты контроллера для сканирования "com.mycompany"

p.s. чтобы построить пример проекта, я должен удалить клиентскую зависимость milton из файла pom.xml

person Dmitry Nazarenko    schedule 28.11.2017
comment
Спасибо, но кажется, что некоторые адреса (например, регистрация пробной корпоративной лицензии) на веб-сайте Milton недоступны. Вариант 3 должен работать, но я не могу использовать пустой менеджер безопасности в своем приложении. Так что, возможно, мне следует использовать другой клиент webdav, кроме Finder. - person chou; 29.11.2017
comment
Вы можете внедрить менеджера безопасности, это никак не повлияет на работу этой штуки. Это просто для того, чтобы сделать это без пароля для тестирования. Вариант 1 доступен, вам необходимо связаться с ними и описать, для чего вам это нужно - person Dmitry Nazarenko; 30.11.2017