Как мне установить папку для хранения загружаемых файлов с помощью Commons FileUpload
Как мне указать место хранения файлов на сервере TOMCAT?
я использую commons.fileupload
и, как оно есть, я могу хранить несколько .tmp
файлы в catalina_base/temp
однако моя цель - сохранить загруженные папки в их d:\\dev\\uploadservlet\\web\\uploads
Я знаю, что этот вопрос неясен, но, честно говоря, я работаю с сервлетами в течение столь короткого промежутка времени, и я пока не понимаю общую картину, любые предложения по коду или ссылки на учебники будут с благодарностью.
Мой код сервлета, который обрабатывает загрузку, выглядит следующим образом:
package test;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.oreilly.servlet.MultipartRequest;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public static final long MAX_UPLOAD_IN_MEGS = 5;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
//This is the folder I want to use!!
//String uploadFolder = "d:\\dev\\uploadservlet\\web\\uploads";
boolean isMultipartContent = ServletFileUpload.isMultipartContent(request);
if (!isMultipartContent) {
out.println("Upload unsuccessful<br/>");
return;
}
out.println("The following was uploaded:<br/>");
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(MAX_UPLOAD_IN_MEGS * 1024 * 1024);
TestProgressListener testProgressListener = new TestProgressListener();
upload.setProgressListener(testProgressListener);
HttpSession session = request.getSession();
session.setAttribute("testProgressListener", testProgressListener);
try {
List<FileItem> fields = upload.parseRequest(request);
out.println("Number of fields: " + fields.size() + "<br/><br/>");
Iterator<FileItem> it = fields.iterator();
if (!it.hasNext()) {
out.println("No fields found");
return;
}
out.println("<table border=\"1\">");
while (it.hasNext()) {
out.println("<tr>");
FileItem fileItem = it.next();
boolean isFormField = fileItem.isFormField();
if (isFormField) {
out.println("<td>regular form field</td><td>FIELD NAME: " + fileItem.getFieldName() +
"<br/>STRING: " + fileItem.getString()
);
out.println("</td>");
} else {
out.println("<td>file form field</td><td>FIELDNAME: " + fileItem.getFieldName() +// <br/>STRING: " + fileItem.getString() +
"<br/>NAME: " + fileItem.getName() +
"<br/>CONTENT TYPE: " + fileItem.getContentType() +
"<br/>SIZE (BYTES): " + fileItem.getSize() +
"<br/>TO STRING: " + fileItem.toString()
);
out.println("</td>");
}
out.println("</tr>");
}
out.println("</table>");
} catch (FileUploadException e) {
out.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
}
... и он получает информацию из этой HTML-формы:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Upload Page</title>
<link rel="stylesheet" type="text/css" href="css/ui-lightness/jquery-ui-1.8.24.custom.css">
<link rel="stylesheet" type="text/css" href="css/style.css"
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/jquery-ui.js"></script>
<script type="text/javascript" src="uploadFunctions.js"></script>
</head>
<body>
<div>
<form name="uploadForm" id="uploadForm" action="test" method="post" enctype="multipart/form-data">
<input type="hidden" name="hiddenfield1" value="ok">
<h3>Files to upload:</h3>
<input type="file" size="50" name="file1">
<span id="file1Progress">-</span>
<br/>
<a href="javascript:previewFile(1)">Preview</a>
<br/>
<br/>
<input type="file" size="50" name="file2">
<span id="file2Progress">-</span>
<br/>
<a href="javascript:previewFile(2)">Preview</a>
<br/>
<br/>
<input type="file" size="50" name="file3">
<span id="file3Progress">-</span>
<br/>
<a href="javascript:previewFile(3)">Preview</a>
<br/>
<br/>
<input type="file" size="50" name="file4">
<span id="file4Progress">-</span>
<br/>
<a href="javascript:previewFile(4)">Preview</a>
<br/>
<br/>
<input type="file" size="50" name="file5">
<span id="file5Progress">-</span>
<br/>
<a href="javascript:previewFile(5)">Preview</a>
<br/>
<br/>
<input type="button" value="Upload" id="submitButton" onclick="uploadForm.submit();doProgress();">
<br/>
<br/>
</form>
<div class="progBar">
File number: <span id="fileText">-</span> is being uploaded.<br/>
<br/>
<progress id="progressBar" value="0" max="100"></progress><br/>
Upload of all files is: <span id="progressText">-</span>% complete.<br/>
</div>
</div>
</body>
</html>
3 ответа
Просто передайте нужное место в FileItem#write()
метод обычным способом, как описано в собственном руководстве пользователя Apache Commons FileUpload.
Сначала инициализируйте папку загрузки в init()
вашего сервлета.
private File uploadFolder;
@Override
public void init() throws ServletException {
uploadFolder = new File("D:\\dev\\uploadservlet\\web\\uploads");
}
(вы можете при необходимости получить эту информацию из переменной окружения или файла свойств)
Затем извлеките базовое имя и расширение из имени файла загруженного файла и сгенерируйте уникальное имя файла на его основе (вы, конечно, не хотите, чтобы ранее загруженный файл перезаписывался, когда кто-то другой по совпадению загружает файл с тем же именем, право?):
String fileName = FilenameUtils.getName(fileItem.getName());
String fileNamePrefix = FilenameUtils.getBaseName(fileName) + "_";
String fileNameSuffix = "." + FilenameUtils.getExtension(fileName);
File file = File.createTempFile(fileNamePrefix, fileNameSuffix, uploadFolder);
fileItem.write(file);
System.out.println("File successfully saved as " + file.getAbsolutePath());
// ...
(обратите внимание, что File#createTempFile()
не обязательно означает, что это временный файл, который будет автоматически удаляться через некоторое время, нет, в данном конкретном случае он просто использовался как инструмент для создания файла с гарантированным уникальным именем файла в данной папке)
FilenameUtils
предоставляется Apache Commons IO, который вы уже должны были установить, поскольку он зависит от Commons FileUpload.
Обратите внимание, что вы не должны устанавливать его в качестве второго аргумента DiskFileItemFactory
конструктор, как предполагает другой ответ. Это представляет, как ясно упомянуто в его javadoc, временное расположение файловой системы диска для хранения выгруженных файлов, когда они превышают пороговый размер (то есть, когда они становятся слишком большими, чтобы полностью удерживаться в памяти сервера). Это местоположение не является постоянным хранилищем для загружаемых файлов. Он будет автоматически очищаться с помощью Commons FileUpload.
Вы видели Javadoc DiskFileItemFactory
? Есть метод setRepository
который занимает File
аргумент (папка, в которой будут храниться временные файлы).
Так что попробуйте это:
FileItemFactory factory =
new DiskFileItemFactory(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD,
new File("d:\\dev\\uploadservlet\\web\\uploads"));
И когда вы анализируете поля формы, вы можете сохранять эти файлы где угодно.
Надеюсь, это поможет вам.
Вы используете FileUpload для управления загрузкой. Итак, в своем коде вы просто определяете файл и записываете в него данные. Я скопирую только соответствующую часть и добавлю к ней:
if (isFormField) {
out.println("<td>regular form field</td><td>FIELD NAME: " + fileItem.getFieldName() +
"<br/>STRING: " + fileItem.getString()
);
out.println("</td>");
} else {
//write the file
String myPath= .....
File f=new File(myPath);
fileItem.write(f);
out.println("<td>file form field</td><td>FIELDNAME: " + fileItem.getFieldName() +// <br/>STRING: " + fileItem.getString() +
"<br/>NAME: " + fileItem.getName() +
"<br/>CONTENT TYPE: " + fileItem.getContentType() +
"<br/>SIZE (BYTES): " + fileItem.getSize() +
"<br/>TO STRING: " + fileItem.toString()
);
out.println("</td>");
}
ВАЖНО: убедитесь, что у вас есть разрешение на запись в папку, в которую вы записываете файл.