1

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

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

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

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

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

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

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

下面是我的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);
}
4

1 回答 1

0

我终于可以成功地将请求从小程序发布到 servlet。这是我缺少的一个简单逻辑。我在 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) 读取数据。感谢您的帮助。

于 2014-02-02T00:21:12.933 回答