У меня есть файл в папке files
, расположенный в корне моего каталога проекта Golang, который называется test.jpg
. Так что это будет ./files/test.jpg
, что я хочу служить своему клиенту, и у меня возникли трудности.
Мой проект golang находится в файле Docker со следующим приложенным томом. (В основном это говорит о том, что /go/.../webserver
в контейнере Docker может читать и записывать из ./
на сервере)
volumes:
- ./:/go/src/github.com/patientplatypus/webserver/
Я использую gorilla/mux
для маршрутизации, как определено:
r := mux.NewRouter()
Вот некоторые из моих попыток получить правильный формат PathPrefix:
r.PathPrefix("/files/").Handler(http.StripPrefix("/files/",
http.FileServer(http.Dir("/go/src/github.com/patientplatypus/webserver/files/"))))
или
r.PathPrefix("/files").Handler(http.FileServer(http.Dir("./files/")))
или
r.PathPrefix("/files/").Handler(http.StripPrefix("/files/",
http.FileServer(http.Dir("./"))))
или
r.PathPrefix("/files/").Handler(http.FileServer(
http.Dir("/go/src/github.com/patientplatypus/webserver/")))
Ранее я успешно записывал на сервер следующую команду:
newPath := filepath.Join("/go/src/github.com/patientplatypus/webserver/files",
"test.jpg")
newFile, err := os.Create(newPath)
Итак, моя интуиция заключается в том, что первая из моих попыток должна быть правильной, с указанием всего пути /go/.../files/
.
В любом случае каждая из моих попыток успешно возвращает 200OK
в мой интерфейс с пустым response.data , как показано здесь:
Object { data: "", status: 200, statusText: "OK",
headers: {…}, config: {…}, request: XMLHttpRequest }
, который приходит из простого http-запроса js с использованием пакета axios
:
axios({
method: 'get',
url: 'http://localhost:8000/files/test.jpg',
})
.then(response => {
//handle success
console.log("inside return for test.jpg and value
of response: ")
console.log(response);
console.log("value of response.data: ")
console.log(response.data)
this.image = response.data;
})
.catch(function (error) {
//handle error
console.log(error);
});
Мое единственное предположение относительно того, почему это происходит, это то, что он не видит файл и поэтому ничего не возвращает.
Для такой, казалось бы, тривиальной проблемы, я нахожусь в стадии предположения и проверки, и я не знаю, как отлаживать дальше. Если у кого-то есть идеи, пожалуйста, дайте мне знать.
Спасибо!
РЕДАКТИРОВАТЬ:
Для полной ясности, вот весь мой файл main.go (всего 150 строк) со всей маршрутизацией. Существует часть промежуточного программного обеспечения, которое обрабатывает аутентификацию JWT, но в этом случае он игнорирует этот маршрут, и есть промежуточное программное обеспечение для обработки CORS.
Выделена соответствующая строка: https://gist.github.com/patientplatypus/36230e665051465cd51291e17825f1f5#file-main-go-L122.
Кроме того, вот мой файл docker-compose, который показывает, какие тома есть (пожалуйста, игнорируйте команду sleep для загрузки postgres - я понимаю, что это не идеальная реализация)
https://gist.github.com/patientplatypus/2569550f667c0bee51287149d1c49568.
Не должно быть никакой другой информации, необходимой для отладки.
Также ... некоторые люди хотели, чтобы я показал, что файл существует в контейнере.
patientplatypus:~/Documents/zennify.me:11:49:09$docker exec
backend_app_1 ls /go/src/github.com/patientplatypus/webserver/files
test.jpg
Показывает, что это так.
Уточнение:
Я неправильно использовал Axios для буферизации массива и получения изображения. Пример этой работы здесь:
//working example image
var imageurl = 'https://avatars2.githubusercontent.com/u/5302751?v=3&s=88';
//my empty server response
//var imageurl = 'http://localhost:8000/files/test.jpg';
axios.get(imageurl, {
responseType: 'arraybuffer'
})
.then( response => {
console.log('value of response: ', response);
console.log('value of response.data: ', response.data);
const base64 = btoa(
new Uint8Array(response.data).reduce(
(data, byte) => data + String.fromCharCode(byte),
'',
),
);
console.log('value of base64: ', base64);
this.image = "data:;base64," + base64
});
Однако это не меняет основную проблему, заключающуюся в том, что golang не возвращает никаких данных (response.data пуст). Просто к вашему сведению, что я подтвердил работоспособность, и это не решает проблему.