2013-04-02 2 views
6

Я новичок в технологии JAVA, особенно в Servlets. Мне нужно создать проект веб-приложения, который загружает и загружает файлы на сервер (tomcat). У меня уже есть сервлет загрузки, который отлично работает.Сервлет для загрузки файлов из определенной папки?

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

Код загрузки сервлета это:

import java.io.DataInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.ServletOutputStream; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 



public class DownloadServlet extends javax.servlet.http.HttpServlet implements 
      javax.servlet.Servlet { 
     static final long serialVersionUID = 1L; 
     private static final int BUFSIZE = 4096; 
     private String filePath;` 

public void init() { 
    // the file data.xls is under web application folder 

    filePath = getServletContext().getRealPath("") + File.separator;// + "data.xls"; 
} 

protected void doGet(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 
    File file = new File(filePath); 
    int length = 0; 
    ServletOutputStream outStream = response.getOutputStream(); 
    ServletContext context = getServletConfig().getServletContext(); 
    String mimetype = context.getMimeType(filePath); 

    // sets response content type 
    if (mimetype == null) { 
     mimetype = "application/octet-stream"; 
    } 
    response.setContentType(mimetype); 
    response.setContentLength((int)file.length()); 
    String fileName = (new File(filePath)).getName(); 

    // sets HTTP header 
    response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); 

    byte[] byteBuffer = new byte[BUFSIZE]; 
    DataInputStream in = new DataInputStream(new FileInputStream(file)); 

    // reads the file's bytes and writes them to the response stream 
    while ((in != null) && ((length = in.read(byteBuffer)) != -1)) 
    { 
     outStream.write(byteBuffer,0,length); 
    } 

    in.close(); 
    outStream.close(); 
} 
} 

страница JSP заключается в следующем:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Download Servlet Test</title> 
</head> 
<body> 
Click on the link to download: <a href="DownloadServlet">Download Link</a> 
</body> 
</html> 

Я искал много сервлетов, но все они были, как это ... они разрешил загрузку только определенного файла. Может ли кто-нибудь мне помочь? Большое спасибо!

+0

Что вы пробовали? Вы внесли какие-либо изменения в код, который вы загрузили? Какие изменения вы внесли? Что сработало? А что нет? Проводили ли вы какие-либо исследования, кроме того, что искали полное решение, которое вы можете скачать? Просто копирование и вставка кода из Интернета не заставит вас очень далеко, вам придется иногда выполнять свою работу. – Adrian

+0

@Adrian Спасибо за ваш ответ. Как я уже сказал, приведенный выше код отлично подходит для загрузки только файла, указанного в качестве пути к нему в Servlet. В этом примере в функции init(). Я попытался указать путь как строку для атрибута filePath.example: filepath = "C: // Apache // Application // data //", но я получил сообщение об ошибке: Access denied. Я попробовал что-то еще: чтобы составить список содержимого папки в моем JSP с атрибутом файла и методом listFiles, а затем пишу '
<% = file.getName()%> ', но это работало только в IE с сохранением цели как. –
AdiCrainic

+0

@ user2236267 попробуйте использовать другой путь, например * C: \\ external \\ path *. Кроме того, убедитесь, что у вашего пользователя достаточно разрешений для записи в эту папку. Я не включил эту информацию, так как предположил, что вы уже это знали. –

ответ

6

Поскольку вы обрабатываете данные по методу doGet, вы можете передать параметр сервлету, где указано имя файла, который вы хотите загрузить. Для этого вы должны предположить, что имя файла существует в вашем базовом пути. Код может идти, как это:

HTML

<body> 
    Click on the link to download: 
    <a href="DownloadServlet?fileName=data.xls">Download Link</a> 
</body> 

Java Servlet Код:

protected void doGet(HttpServletRequest request, 
    HttpServletResponse response) throws ServletException, IOException { 
    //retrieving the parameter by its name 
    String fileName = request.getParameter("fileName"); //this will return `data.xls` 
    //using the File(parent, child) constructor for File class 
    File file = new File(filePath, fileName); 
    //verify if the file exists 
    if (file.exists()) { 
     //move the code to download your file inside here... 

    } else { 
     //handle a response to do nothing 
    } 
} 

Обратите внимание, что поскольку код теперь использует File(String parent, String child) конструктор, ваш filePath не должен содержать разделитель больше (это будут обрабатываться Java):

public void init() { 
    // the file data.xls is under web application folder 
    filePath = getServletContext().getRealPath(""); 
} 
+0

** Большое спасибо за ваш ответ ** Я пробовал свой код, но я не могу заставить его работать. – AdiCrainic

+0

@ пользователь2236267 дайте ему попробовать. Если он работает для ваших нужд, отметьте отметку ниже репутации, чтобы отметить сообщение в качестве ответа. –

+0

Я новичок в stackoverflow.it, мне потребуется некоторое время для работы с этим. Я попытался дать голосование до вашего ответа, но он сказал мне, что мне нужно 15 репутации. Я хочу ответить своим новым кодом, но он говорит, что мой комментарий слишком велик. – AdiCrainic

1

0 можно сделать как то

 public void doGet(HttpServletRequest req, HttpServletResponse res){ 
    res.setContentType("text/html); 
     PrintWriter out=response.getWriter(); 
     String fileName="home.txt"; 
     String filePath="d:\\"; 
    response.setContentType("APPLICATION/OCTET-STREAM"); 
    response.setHeader("Content-Disposition","attachment;fileName=\""+fileName+"\""); 
    int i; 
    FileInputStream file=new FileInputStream(filePath +fileName); 
    while((i=file.read()) !=-1){ 
     out.write(i); 
    } 
    file.close(); 
    out.close(); 
} 
0
// get MIME type of the file 
    String mimeType = context.getMimeType(fullPath); 
    if (mimeType == null) { 
     // set to binary type if MIME mapping not found 
     mimeType = "application/octet-stream"; 
    } 
    System.out.println("MIME type: " + mimeType); 

    // set content attributes for the response 
    response.setContentType(mimeType); 
    response.setContentLength((int) downloadFile.length()); 

В этом более подробно и вопрос, как улучшить: https://stackoverflow.com/questions/41914092/how-change-servlet-which-download-single-file-but-can-folderfew-files-in-fold

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