Браузер файлов Chrome - доступ к полному пути - PullRequest
0 голосов
/ 17 января 2019

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

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

Ситуация следующая.

  • Бэкэнд и работающий пользователь имеют доступ к одной и той же файловой системе.
  • Пользователь должен выбрать одно или несколько местоположений файлов и сообщить бэкэнду.
  • Затем бэкэнд будет планировать задачу.
  • Между тем, содержимое файла может быть изменено пользователем, но местоположение останется прежним.
  • Браузер пользователей находится под нашим контролем. Таким образом, мы могли бы использовать расширения при необходимости.

Вопросы

  • Есть ли какая-либо опция Chrome, которая обойдет защитный барьер и позволит мне получить доступ к полному пути?
  • Есть ли какое-нибудь полезное расширение для Chrome?
  • Есть ли какие-нибудь известные альтернативные решения или "лучшие практики", советующие эту проблему?

1 Ответ

0 голосов
/ 17 января 2019

Я не понимаю, почему вы захотите повторно использовать <input type="file"> или , как вы бы использовали системный браузер файлов, чтобы сделать это.

Ваша проблемаутверждение было бы намного проще, если бы вы просто перечислили файлы, доступные в каталоге, а затем выполнили действие на основе этой информации.

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "net/url"
)

func main() {
    r := http.NewServeMux()

    r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        files, err := ioutil.ReadDir(".")
        if err != nil {
            log.Fatal(err)
        }

        out := "<ul>"
        for _, f := range files {
            v := url.Values{}
            v.Add("file", f.Name())
            out += fmt.Sprintf(`<li><a href="/do?%s">%s</a></li>`, v.Encode(), f.Name())
        }
        out += "</ul>"

        w.Header().Set("Content-Type", "text/html")
        fmt.Fprintf(w, out)
    })

    r.HandleFunc("/do", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, r.URL.Query().Get("file"))
    })

    server := &http.Server{
        Addr:    ":8080",
        Handler: r,
    }

    if err := server.ListenAndServe(); err != nil {
        log.Fatal(err)
    }
}

https://play.golang.org/p/bSgm4nAUUYg

Примечание: Этот код не безопасен для производства.Вам нужно беспокоиться о людях, которые могут получить доступ к каталогам выше, где вы находитесь .., и о всевозможных забавных вещах, связанных с обменом информацией о сервере.Но это только для того, чтобы помочь вам начать работу.

Тогда вам не нужно беспокоиться о том, что браузер передает вам, вы полностью контролируете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...