Форум программистов, компьютерный форум, киберфорум
Наши страницы
Go
Войти
Регистрация
Восстановить пароль
 
DrankUser
0 / 2 / 3
Регистрация: 29.01.2017
Сообщений: 83
Завершенные тесты: 2
#1

Написал простенький файловый сервер, ошибка при загрузке файлов - Язык Go

28.12.2017, 22:52. Просмотров 256. Ответов 6

По-быстрому с целью ознакомления написал небольшой файловый сервер
Из handle функции, если путь соответствует регулярному выражению, передаю его вот в эту функцию
Код
func (s *ServerRouter) loadFile(path string) {
	ext := path[strings.LastIndex(path, ".")+1:]
	var contentType string
	switch strings.ToLower(ext) {
	case "js":
		contentType = "text/javascript"
	case "css":
		contentType = "text/css"
	case "html", "htm", "gohtml":
		contentType = "text/html"
	case "jpeg", "jpg":
		contentType = "image/jpeg"
	case "png":
		contentType = "image/png"
	case "bm", "bmp":
		contentType = "image/bmp"
	default:
		s.notFound()
	}

	f, err := os.Open("public/" + path)
	defer f.Close()

	if err != nil {
		s.notFound()
	}

	s.Writer.Header().Add("Content-Type", contentType)

	buf := bufio.NewReader(f)

	buf.WriteTo(s.Writer)
}
ServerRouter просто обёртка для http.Request и ResponseWriter

Но это не суть, сервер то работает, файлы выгружает, даже web-страничку неплохую можно получить.

Проблема выявилась чуть позже, причём очень странная

Иногда, при обновлении страницы, вместо нормальных правильных css и js файлов приходят поломанные, у css файла не стоит Content-Type, а всё содержимое js файла засунуто в конец css, бывает что некоторые файлы обрезаются и прочие неприятные вещи.

Сервер запускал во время тестов на локалхосте
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2017, 22:52
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Написал простенький файловый сервер, ошибка при загрузке файлов (Язык Go):

Файловый веб-сервер на golang
собственно вот пример простой, работает хорошо package main; import ( "http" "fmt" ) func requestHandler(w...

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

Собираем простенький файловый сервер
На данном компьютере будет располагаться база данных 1С, в которой будут работать 4-5 пользователей. Никаких RAID массивов. Конфигурацию...

Файловый сервер. Ошибка с перезаписью файлов
День добрый. Система: Windows server 2008 r2.На файловом сервере начались проблемы. Дизайнеры работают в Indesign cs5 и делают экспорт в...

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

При множественной загрузке файлов на сервер загружается лишь один.
доброе время суток. такая ситуация: загружаю несколько файлов через <input type="file" multiple />, отправляю на сервер, но туда приходит...

6
NoMasters
Псевдослучайный
1909 / 1120 / 90
Регистрация: 13.09.2011
Сообщений: 3,177
29.12.2017, 09:08 #2
Остро не хватает досрочных выходов из функции при ошибках. И закрывать тоже нечего, если os.Open() прошла неудачно.
0
DrankUser
0 / 2 / 3
Регистрация: 29.01.2017
Сообщений: 83
Завершенные тесты: 2
29.12.2017, 18:43  [ТС] #3
NoMasters, с файловым потоком уже начал баловаться после обнаружения проблемы. До этого был простой ReadFile и результат тот же

С ошибками поработаю, но всё же это что-то очень странное поведение.

Добавлено через 9 минут
Код
http: multiple response.WriteHeader calls
Вот такое сообщение пишет сервер при работе.
Ещё пару раз вылетало
Код
fatal error: concurrent map writes
0
Dmitriy_M
1410 / 1293 / 124
Регистрация: 20.03.2009
Сообщений: 4,604
Записей в блоге: 11
05.01.2018, 17:43 #4
DrankUser, ты пытаешься работать так, как будто сервер однопоточный.
C
1
2
3
4
5
    s.Writer.Header().Add("Content-Type", contentType)
 
    buf := bufio.NewReader(f)
 
    buf.WriteTo(s.Writer)
Это не прокатит в многопоточном окружении.
1
DrankUser
0 / 2 / 3
Регистрация: 29.01.2017
Сообщений: 83
Завершенные тесты: 2
05.01.2018, 17:45  [ТС] #5
Dmitriy_M, ага, хорошо, а как тогда написать это вот многопоточно?
0
Dmitriy_M
1410 / 1293 / 124
Регистрация: 20.03.2009
Сообщений: 4,604
Записей в блоге: 11
05.01.2018, 19:37 #6
не использовать глобальные и общие данные
0
DrankUser
0 / 2 / 3
Регистрация: 29.01.2017
Сообщений: 83
Завершенные тесты: 2
05.01.2018, 22:36  [ТС] #7
Dmitriy_M, товарищ, в самом деле, я же знаю что такое параллельное программирование, я имею ввиду вот эту конкретную ситуацию с запуском файлового потока.

Ну да ладно, вы мне и так уже помогли, дальше Гугл и документация
0
05.01.2018, 22:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2018, 22:36
Привет! Вот еще темы с решениями:

Ошибка при загрузке dt файлов
Добрый, ошибка при загрузке dt файлов что может быть?

Upload to OneDrive: ошибка 404 при загрузке файла на сервер
День добрый. На сервере OneDrive (Microsoft) имеется некий файл. Этот файл открыт для общего доступа, для чтения и редактирования. ...

Загрузка файлов: ошибка кодировки при загрузке
Здравствуйте. Подскажите, как исправить ошибку с загрузкой файлов. Если имя файла указано русскими буквами, при загрузке сбивается на...

Ошибка (503) при загрузке с Ftp файлов
Здравствуйте, есть задача загрузить все файлы, находящиеся в определённой папке на ftp. Получаю список файлов на сервере в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru