2013-02-12 4 views
2

Glassfish, кажется, добавляет лишний путь, я хочу также сохранить свой файл изображения, есть ли способ использовать только абсолютный путь, который получает мой сервлет сjava.io.FileNotFoundException при записи загруженного файла на диск с помощью getRealPath()

String appPath = request.getServletContext().getRealPath("");?

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

Я использовал этот пример: http://www.codejava.net/java-ee/servlet/how-to-write-upload-file-servlet-with-servlet-30-api

Использование отладки я могу видеть информацию имя файла и путь собран правильно, но код не в `part.write (SavePath + File.separator + FileName);` `

И отчет исключение GlassFish является:

exception 

java.io.FileNotFoundException: C:\Program Files\glassfish-3.1.2.2\glassfish\domains\domain1\generated\jsp\com.onemore_onemore-web_war_1.0-SNAPSHOT\D:\Dropbox\Git\Brian_JEE\onemore\onemore\onemore-web\target\onemore-web-1.0-SNAPSHOT\image\screengrab_all_products.jpg (The filename, directory name, or volume label syntax is incorrect) 

Я вижу правильный путь в рамках этого исключения D:\Dropbox\Git\Brian_JEE\onemore\onemore\onemore-web\target\onemore-web-1.0-SNAPSHOT\image\screengrab_all_products.jpg

JSP

<form action="${pageContext.request.contextPath}/imageupload" method="post" enctype="multipart/form-data" name="productForm" id="productForm"> 
<input type="file" name="file" id="file"> 
<input type="submit" name="Submit" value="Submit"></td> 
</form> 

Servlet

@WebServlet(name = "UploadImageServlet", urlPatterns = {"/imageupload"}) 
@MultipartConfig(fileSizeThreshold = 1024 * 1024 * 2, // 2MB 
maxFileSize = 1024 * 1024 * 10, // 10MB 
maxRequestSize = 1024 * 1024 * 50) // 50MB 
public class UploadImageServlet extends HttpServlet { 

    /** 
    * Name of the directory where uploaded files will be saved, relative to the 
    * web application directory. 
    */ 
    private static final String SAVE_DIR = "image"; 

    /** 
    * handles file upload 
    */ 
    @Override 
    protected void doPost(HttpServletRequest request, 
      HttpServletResponse response) throws ServletException, IOException { 
     // gets absolute path of the web application 
     String appPath = request.getServletContext().getRealPath(""); 
     // constructs path of the directory to save uploaded file 
     String savePath = appPath + File.separator + SAVE_DIR; 

     // creates the save directory if it does not exists 
     File fileSaveDir = new File(savePath); 
     if (!fileSaveDir.exists()) { 
      fileSaveDir.mkdir(); 
     } 

     for (Part part : request.getParts()) { 
      String fileName = extractFileName(part); 
      part.write(savePath + File.separator + fileName); 
     } 

     request.setAttribute("message", "Upload has been done successfully!"); 
     getServletContext().getRequestDispatcher("/WEB-INF/jsp/newproduct.jsp").forward(
       request, response); 
    } 

    /** 
    * Extracts file name from HTTP header content-disposition 
    */ 
    private String extractFileName(Part part) { 
     String contentDisp = part.getHeader("content-disposition"); 
     String[] items = contentDisp.split(";"); 
     for (String s : items) { 
      if (s.trim().startsWith("filename")) { 
       return s.substring(s.indexOf("=") + 2, s.length() - 1); 
      } 
     } 
     return ""; 
    } 
} 

ответ

4

Никогда не используйте getRealPath()

Вы не должны сохранять загруженные файлы в папку развертывания. Я так много раз объяснял это раньше. Одно из этих объяснений можно найти в этом ответе: Uploaded image only available after refreshing the page.

Любой фрагмент кода JSP/сервлета, найденный в каком-либо блоге/статье, который когда-либо использует метод getRealPath(), должен быть взят с огромным пакетом соли. Его качество и знания автора должны быть поставлены под сомнение. There is namely no sensible real world use case for that method.

Сохранение загруженных файлов по фиксированному пути за пределами папки развертывания. См. Также How do I set the folder for storing file uploads using Commons FileUpload.

+0

Благодарим вас за ответ. Я прочитал много ваших сообщений, теперь у меня есть изображения из папки развертывания и задано новое свойство 'alternatedocroot_1' в' glassfish-web.xml', которое правильно отображает изображения для отображения. К сожалению, мой 'part.write' настаивает на записи файлов в неправильную папку независимо от того, какой путь я ввожу. Не могли бы вы показать мне, как получить 'write.part', чтобы сохранить файл в папку, которую я установил. спасибо –

+0

Убедитесь, что путь начинается с косой черты: 'part.write ("/path/to/filename.ext ")'. – BalusC

+1

спасибо. После прочтения аннотаций @MultipartConfig я обнаружил, что могу установить путь с помощью 'location =" **** "' Файл успешно загружается в нужную папку, а затем glassfish сообщает об исключении (File Access Denied). Хотя хотя бы файл идет в нужное место. –

Смежные вопросы