• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Сохранение файла в xpages

  • Автор темы JohnLemon
  • Дата начала
J

JohnLemon

Здравствуйте, подскажите пожалуйста, есть код сохранения данных в тип данных bytea, а так же чтение с него и сохранение в файл.
Код:
package com.my.test;
 
 
 
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.faces.context.FacesContext;
import com.ibm.xsp.extlib.util.JdbcUtil;
 
 
 
 
public class Test {
//сохранение в Bytea
public static void saveToBytea() throws IOException {
try {
Connection conn = JdbcUtil.getConnection(FacesContext.getCurrentInstance(), "derby1");
File loadFile = new File("c:\\test.txt");
FileInputStream fis = new FileInputStream(loadFile);
PreparedStatement ps = conn.prepareStatement("INSERT INTO test_goverment (who, files) VALUES (?, ?)");
//ps.setString(1, loadFile.getName());
ps.setString(1, "d");
ps.setBinaryStream(2, fis, (int)loadFile.length());
ps.executeUpdate();
ps.close();
fis.close();
 
} catch(SQLException exception) {
System.out.println(exception.getMessage());
}
}
//сохранение в файл
public static void saveToFile() throws IOException {
try {
Connection conn = JdbcUtil.getConnection(FacesContext.getCurrentInstance(), "derby1");
		ResultSet rs = conn.createStatement().executeQuery(
						"SELECT files FROM test_goverment where who='d'");
		byte[] imgBytes = null;
		if (rs != null) {
			while (rs.next()) {
				imgBytes = rs.getBytes(1);
			}
			FileOutputStream os = new FileOutputStream("c:\\samoutput.txt");
			os.write(imgBytes);
			os.flush();
			os.close();
		}
		rs.close();
		conn.close();
	} catch (SQLException e) {
		e.printStackTrace();
	}
}
}

Подскажите пожалуйста как передать этот файл в xpages. Что бы пользователь сам его сохранял на диск ?
 

garrick

Lotus Team
26.10.2009
1 351
151
BIT
187
1. Сделать редирект на этот файл по его URL. Естественно файл при этом должен быть в доступном для сервера каталоге.
2. Сформировать специальную HTML страницу (см. Content-Type) и переадресовать пользователя на неё.
 
J

JohnLemon

Я как раз хочу от создания файла на сервере, смысл его создавать ели есть bytea...Хотелось бы передать как то в xpages java.io.File или FileOutputStream, а там что бы пользователь это уже сохранил себе как нужно....Или сохранить на java, прсосто я не представляю пока даже как лучше это сделать
 
Последнее редактирование:

alexas1

Green Team
10.04.2014
1 202
225
BIT
36
Или может в Java можно как то создать временный файл? Не хочется засорять сервак файлами просто, тем более на каждую загрузку новый файл это будет капец...Да и куда сохранять их что бы доступ был для xpages ?
Вот все эти вопросы говорят о том, что выбранная архитектура неправильная и искусственная. Не надо создавать себе трудности и потом их мужественно преодолевать. Ты ещё можешь столкнуться с нехваткой памяти на сервере, когда несколько юзеров будут тянуть из постгри объёмные картинки одновременно.
А икспэйджу до фонаря откуда тянуть файло - разве трудно организовать темповую диру с доступом без ограничений?
Ну а файл, который туда попал, после использования удалить. И всё там будет чисто.
 
J

JohnLemon

Ну а файл, который туда попал, после использования удалить. И всё там будет чисто.
А как же безопасность, если пользователь не использует файл, или использует но он по каким либо причинам не удалится ? скопирует ссылку и разошлет другим которым не нужно видеть этот файл ?
Хранить в базе файлы, не моя задумка... просто хотелка человека у которого свои на это причины. Скажите это вообще реально передать java.io.File или FileOutputStream в xpages и сохранить в файл ? Тем более нужно дать возможность пользователю несколько раз скачивать один файл иначе юзабилити теряется ).
 
Последнее редактирование:

alexas1

Green Team
10.04.2014
1 202
225
BIT
36
скопирует ссылку и разошлет другим которым не нужно
Дык, ссылка формируется под конкретным аккаунтом на файл с уникальным именем (рандомом, напр.)
Ничо другой юзверь не увидит. Для него ссылка будет другой, даже на этот же файл.
"зависшие" временные файлы удалять чисткой всей директории агент, когда никто не робит (по ночам, по выходным...)
 

alexas1

Green Team
10.04.2014
1 202
225
BIT
36
Тем более нужно дать возможность пользователю несколько раз скачивать один файл иначе юзабилити теряется
Дык и не удалять файло пока юзверь не закрыл сеанс. А в новом сеансе будет сохранять на диск опять (пусть заказчик и рвёт волосы на разных местах, если ему покажется медленно - это его идиотизм. или покупает шуструю дисковую подсистему на "темп" SSD напр.)
 
  • Нравится
Реакции: JohnLemon
J

JohnLemon

Дык, ссылка формируется под конкретным аккаунтом на файл с уникальным именем (рандомом, напр.)
Ничо другой юзверь не увидит.
Это все хорошо, но как тогда мне сформировать ссылку на файл ? Через шару типа //server/temp, дак любой пользователь сможет зайти и посмотреть что там ?
 
J

JohnLemon

Примерно понял как надо. На первой странице делаю кнопку
JavaScript:
sessionScope.put("filepath", "c:\\test.txt");
context.redirectToPage("/downloadFile.xsp")
На второй downloadFile.xsp в событиях
beforeRenderResponse:
JavaScript:
facesContext.responseComplete()
afterRenderResponse:
JavaScript:
if (sessionScope.containsKey("filepath")){
	FileDownload.sendFile(sessionScope.filepath);
}
код java
Java:
public static void sendFile(String filepath) {
	File file = new File(filepath);
	if (file.exists()) {
		ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
		HttpServletResponse response = (HttpServletResponse) ec.getResponse();
		response.setContentType(MIME(filepath)); // figure out the type from extension or else
		OutputStream out;
		try {
			// for the download dialog
			response.setHeader("Content-disposition",
					"attachment; filename*=utf-8''" + java.net.URLEncoder.encode(file.getName(), "UTF-8").replace("+", "%20"));
			out = response.getOutputStream();
			FileInputStream in = new FileInputStream(file);
			byte[] buffer = new byte[4096];
			int length;
			while ((length = in.read(buffer)) > 0) {
				out.write(buffer, 0, length);
			}
			in.close();
			out.flush();
		} catch (IOException e) {
		}
	}
}
//***********************************
private static String MIME(String filepath) {
// TODO Автоматически созданная заглушка метода
return null;
}
Предлагает почему то скачать downloadFile.xsp. Может кто подсказать где я накосячил ) ?
 
J

JohnLemon

может кто скинуть рабочий пример ? Как дать скачать файл пользователю и удалить его?
 
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!