使用apache fileupload将文件从applet上传到servlet

时间:2014-01-28 20:14:59

标签: servlets upload applet httprequest apache-commons-fileupload

完成: 使用apache fileupload jar使用applet和servlet将文件从本地上传到服务器。

试过: 我使用了一个简单的jsp,带有一个浏览按钮,并将操作发布到我的servlet(我使用apache fileupload)。我成功地将文件上传到服务器。

问题: 我正在尝试使用applet从本地计算机上传文件。我不想手动选择文件,而是上传特定文件夹中存在的文件。现在我已经硬编码了文件夹。我可以查看该文件夹并获取我要上传的文件列表。 此外,我已成功建立从applet到servlet的连接。

问题出现在servlet中的upload.parseRequest(request)我在想它,因为applet无法发布到servlet的请求对象。 另外,我已在我的applet中将请求类型设置为multipart/form-data。 现在,我试图将文件的绝对路径传递给servlet并上传。

我见过其他帖子,其中字节流数据从applet传递到servlet,但servlet使用传统的File.write。 对我来说,必须使用apache fileupload来实现这一点。

请建议如何将文件/文件路径从applet传递到servlet,其中上传由apache fileupload处理。

下面是我的FileUploadHandler(处理HTTP请求的地方)和FileUpload(这是我的applet)

以下是 FileUpload处理程序

@WebServlet(name = "FileUploadHandler", urlPatterns = { "/upload" })
@MultipartConfig
public class FileUploadHandler extends HttpServlet {
    String uploadFolder ="";
    @Override
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        System.out.println("doPost-servlet URL is: "
                + request.getRequestURL());
        try {
            uploadFolder = fileToUpload(request);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
          uploadFolder = getServletContext().getRealPath("")+ File.separator;

        //   Create a factory for disk-based file items 
        DiskFileItemFactory factory = new DiskFileItemFactory();

        // Create a new file upload handler 
        ServletFileUpload upload = new ServletFileUpload(factory);
        // process only if its multipart content

    if (ServletFileUpload.isMultipartContent(request)) {
        System.out.println("Yes, it is a multipart request...");
        try {
                List<FileItem> multiparts = upload.parseRequest(request);

                System.out.println("Upload.parseRequest success !");

                for (FileItem item : multiparts) {
                    if (!item.isFormField()) {
                        String name = new File(item.getName()).getName();
                        item.write(new File(uploadFolder + File.separator
                                + name));
                    }
                }
                System.out.println("File uploaded to server !");
                // File uploaded successfully
                request.setAttribute("message", "File Uploaded Successfully");
            } catch (Exception ex) {
                request.setAttribute("message", "File Upload Failed due to "
                        + ex);
            }

        }  if(!ServletFileUpload.isMultipartContent(request)){
            throw new ServletException("Content type is not multipart/form-data");
        }


        doGet(request, response);
        //request.getRequestDispatcher("/result.jsp").forward(request, response);
        OutputStream outputStream = response.getOutputStream();
         ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
          objectOutputStream.writeObject("Success !");
          objectOutputStream.flush();
          objectOutputStream.close();
    }


    private String fileToUpload(HttpServletRequest request) throws IOException,
            ClassNotFoundException {
            ServletInputStream servletIn = request.getInputStream();
            ObjectInputStream in = new ObjectInputStream(servletIn);
            String uploadFile = (String) in.readObject();
            System.out.println("Value in uploadFolder is: " + uploadFile);
            return uploadFile;
    }

以下是文件上传小程序

public class FileUpload extends Applet {
private JButton capture;
private JTextField textField;
private final String pathDirectory = "C:\\";
private final String captureConfirmMessage = "Are you sure you want to continue?";
private final String confirmDialogTitle = "Confirm upload";
final File folder = new File(pathDirectory);

public void init() {
    upload= new JButton("Upload");
    textField = new JTextField();
    capture.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            int selection = JOptionPane.showConfirmDialog(upload,
                    uploadConfirmMessage, confirmDialogTitle,
                    JOptionPane.YES_NO_OPTION);

            if (selection == JOptionPane.OK_OPTION) {
                listFilesForFolder(folder);

            } else if (selection == JOptionPane.CANCEL_OPTION) {
                JOptionPane.showMessageDialog(upload,
                        "You have aborted upload", "Upload Cancelled", 2);
            }

        }
    });

    add(upload);
    add(textField);
}

public void listFilesForFolder(final File folder) {
    for (final File fileEntry : folder.listFiles()) {
        if (fileEntry.isDirectory()) {
            listFilesForFolder(fileEntry);
        } else {
            try {
                onSendData(fileEntry.getAbsolutePath());
                System.out.println(fileEntry.getAbsolutePath());

            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }
}

private URLConnection getServletConnection() throws MalformedURLException,
        IOException {
    // Open the servlet connection
    URL urlServlet = new URL("http://localhost:8081/UploadFile/upload");
    HttpURLConnection servletConnection = (HttpURLConnection) urlServlet
            .openConnection();
    // Config
    servletConnection.setDoInput(true);
    servletConnection.setDoOutput(true);

    servletConnection.setUseCaches(false);
    servletConnection.setDefaultUseCaches(false);
    servletConnection.setRequestProperty("Content-Type", "multipart/form-data;");
    servletConnection.connect();

    return servletConnection;
}

private void onSendData(String fileEntry) {
    try {
        // Send data to the servlet
        HttpURLConnection servletConnection = (HttpURLConnection) getServletConnection();
        OutputStream outstream = servletConnection.getOutputStream();
        ObjectOutputStream objectOutputStream= new ObjectOutputStream(
                outstream);
        objectOutputStream.writeObject(fileEntry);

                    // Receive result from servlet
        InputStream inputStream = servletconnection.getInputStream();
        ObjectInputStream objectInputStream = new ObjectInputStream(
                inputStream);
        String result = (String) objectInputStream.readObject();
        objectInputStream.close();
        inputStream.close();
        out.flush();
        out.close();

        // Display result on the applet
        textField.setText(result);
    } catch (java.net.MalformedURLException mue) {
        mue.printStackTrace();
        textField.setText("Invalid serlvetUrl, error: " + mue.getMessage());

    } catch (java.io.IOException ioe) {
        ioe.printStackTrace();
        textField.setText("Couldn't open a URLConnection, error: "
                + ioe.getMessage());
    } catch (Exception e) {
        e.printStackTrace();
        textField.setText("Exception caught, error: " + e.getMessage());
    }
}

public void paint(Graphics g) {
    g.drawString("Click the button above to capture", 5, 50);
}

1 个答案:

答案 0 :(得分:0)

我终于可以成功地将请求从applet发布到servlet了。 我错过了一个简单的逻辑。我没有添加标题和预告片,同时发送到servlet,这是密钥,在servlet中将传入的请求标识为多部分数据。

            FileInputStream fileInputStream = new FileInputStream(new File(
                fileEntry));
        dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd);
        dataOutputStream
                .writeBytes("Content-Disposition: form-data; name=\"upload\";"
                        + " filename=\"" + fileEntry + "\"" + lineEnd);
        dataOutputStream.writeBytes(lineEnd);

        // create a buffer of maximum size
        bytesAvailable = fileInputStream.available();
        bufferSize = Math.min(bytesAvailable, maxBufferSize);
        buffer = new byte[bufferSize];
        // read file and write it into form
        bytesRead = fileInputStream.read(buffer, 0, bufferSize);
        while (bytesRead > 0) {
            dataOutputStream.write(buffer, 0, bufferSize);
            bytesAvailable = fileInputStream.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            bytesRead = fileInputStream.read(buffer, 0, bufferSize);
            System.out.println(fileEntry + " uploaded.");
        }

        // send multipart form data necesssary after file data
        dataOutputStream.writeBytes(lineEnd);
        dataOutputStream.writeBytes(twoHyphens + boundary + twoHyphens
                + lineEnd);

我添加了标题和预告片,并使用它来创建URL连接。

private URLConnection getServletConnection() throws MalformedURLException,
        IOException {
    // Open the servlet connection
    URL urlServlet = new URL("http://localhost:8083/UploadFile/upload");
    HttpURLConnection servletConnection = (HttpURLConnection) urlServlet
            .openConnection();
    // Config
    servletConnection.setDoInput(true);
    servletConnection.setDoOutput(true);
    servletConnection.setUseCaches(false);
    servletConnection.setDefaultUseCaches(false);
    servletConnection.setRequestMethod("POST");
    servletConnection.setRequestProperty("Content-Type",
            "multipart/form-data;boundary=" + this.boundary);
    servletConnection.setRequestProperty("Connection", "Keep-Alive");
    servletConnection.connect();
    return servletConnection;
}

然后,在servlet中,我只是使用upload.ParseRequest(request)读取数据。 谢谢你的帮助。

相关问题