2014-07-22 70 views
1

目前我正在從瀏覽器上傳一個圖像。現在在後端有java代碼,我正在檢索這個圖像並轉換成字節數組並存儲到數據庫中,這部分工作實際上很好如何獲得Java中的絕對路徑

的代碼是這樣的:

String fromLocal = "D:/123.jpg"; 
     File file = new File(fromLocal); 
     InputStream inputStream = null; 
     byte[] bFile= null; 
     byte[] imageData = null; 
     try { 
      inputStream = new BufferedInputStream(new FileInputStream(file)); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(8192); 
      bFile = new byte[8192]; 
      int count; 
      while((count = inputStream.read(bFile))> 0){ 
       baos.write(bFile, 0, count); 
      } 
      bFile = baos.toByteArray(); 
      if(bFile.length > 0){ 
       imageData = bFile; 
      } 
      baos.flush(); 
      inputStream.close(); 
     } catch (Exception ioe) { 
      //throw ioe; 
     } 

問題是,每當我試圖硬編碼圖像路徑(如這裏d:/123.jpg)這是工作精絕。現在它的依賴於用戶的依賴於&的客戶端,他可以從任何目錄下的任何驅動器加載圖像&。我沒有使用servlet的特權。 我的查詢是:

1.現在,如果我試圖從D:/123.jpg上傳相同的圖像從瀏覽器我只得到123.jpg不像D:/123.jpg的絕對路徑。因爲現在無法處理圖像。

2.如何知道用戶試圖上傳圖片的特定路徑(可以說用戶從C:/images/123.jpg上傳圖片),那麼如何獲得這個絕對路徑。

我盡力詳述我的問題,讓我知道如果有什麼不清楚我會嘗試以其他方式解釋。

+0

您是否正在尋找Java中的getAbsolutePath()方法 –

+0

用戶上傳文件在哪裏?上傳意味着你正在使用一個網站,但你說「我沒有使用servlet的特權」。你的軟件在哪裏運行? – f1sh

+0

重新提問2,我非常肯定,目前大多數瀏覽器出於安全原因都不會發布文件的完整路徑。 – George

回答

1

如果用戶正在將文件上傳到您的servlet,則該文件包含在請求正文中,而不在服務器上的任何路徑上。最終用戶的客戶端機器上的路徑無關緊要(無論如何,您甚至不能訪問它,甚至不能訪問客戶端)。

有一個Java EE 6 tutoral上的文件上傳這裏:http://docs.oracle.com/javaee/6/tutorial/doc/glraq.html

從根本上(從那個例子),如果用於上傳字段的名稱爲file,你在你的servlet做到這一點:

final Part filePart = request.getPart("file"); 
InputStream filecontent = null; 

再後來內try/catch

filecontent = filePart.getInputStream(); 

...並從流使用的數據。

下面是上述教程的源代碼(以防某些人稍後閱讀時無法訪問)。在這種情況下,它將文件寫入文件服務器端,但在您的情況下,您將填充您的imageData(我把它放入數據庫)。

@WebServlet(name = "FileUploadServlet", urlPatterns = {"/upload"}) 
@MultipartConfig 
public class FileUploadServlet extends HttpServlet { 

    private final static Logger LOGGER = 
      Logger.getLogger(FileUploadServlet.class.getCanonicalName()); 

    protected void processRequest(HttpServletRequest request, 
      HttpServletResponse response) 
      throws ServletException, IOException { 
     response.setContentType("text/html;charset=UTF-8"); 

     // Create path components to save the file 
     final String path = request.getParameter("destination"); 
     final Part filePart = request.getPart("file"); 
     final String fileName = getFileName(filePart); 

     OutputStream out = null; 
     InputStream filecontent = null; 
     final PrintWriter writer = response.getWriter(); 

     try { 
      out = new FileOutputStream(new File(path + File.separator 
        + fileName)); 
      filecontent = filePart.getInputStream(); 

      int read = 0; 
      final byte[] bytes = new byte[1024]; 

      while ((read = filecontent.read(bytes)) != -1) { 
       out.write(bytes, 0, read); 
      } 
      writer.println("New file " + fileName + " created at " + path); 
      LOGGER.log(Level.INFO, "File{0}being uploaded to {1}", 
        new Object[]{fileName, path}); 
     } catch (FileNotFoundException fne) { 
      writer.println("You either did not specify a file to upload or are " 
        + "trying to upload a file to a protected or nonexistent " 
        + "location."); 
      writer.println("<br/> ERROR: " + fne.getMessage()); 

      LOGGER.log(Level.SEVERE, "Problems during file upload. Error: {0}", 
        new Object[]{fne.getMessage()}); 
     } finally { 
      if (out != null) { 
       out.close(); 
      } 
      if (filecontent != null) { 
       filecontent.close(); 
      } 
      if (writer != null) { 
       writer.close(); 
      } 
     } 
    } 

    private String getFileName(final Part part) { 
     final String partHeader = part.getHeader("content-disposition"); 
     LOGGER.log(Level.INFO, "Part Header = {0}", partHeader); 
     for (String content : part.getHeader("content-disposition").split(";")) { 
      if (content.trim().startsWith("filename")) { 
       return content.substring(
         content.indexOf('=') + 1).trim().replace("\"", ""); 
      } 
     } 
     return null; 
    } 
} 
+0

@ Crowder - 似乎我的項目不會使用servlets API 3.0和tomcat 7.0 ..任何其他解決方案 –

+0

@UdayKonduru:有[Apache Commons FileUpload](http://commons.apache.org/proper/commons-fileupload/ using.html)。基本上:數據在請求中,所以你從請求中讀取數據。 –

1

如果您要提交,因爲protocol(HTTP)使用瀏覽器形式,你不能獲得絕對路徑。
圖像文件將附加到請求對象(沒有任何絕對路徑)。而已!!!

+0

這是爲什麼downvoted?這是正確的! – f1sh

+0

雅曼,向下選民可能會提及的意見​​:) – Jaykishan

+0

我的猜測是,雖然它是正確的,但它沒有有用地回答這個問題。 @Jaykishan:不要期待downvoters發表評論,SE管理層會積極勸阻。 :-)(顯然它只是導致爭論或其他...) –

相關問題