【问题标题】:Posting File to WebServer with Java使用 Java 将文件发布到 WebServer
【发布时间】:2014-06-05 15:13:35
【问题描述】:

我正在尝试使用本地 Java 应用程序将文件发布到 ASP.NET WEB API (C#) 服务器。 基本上我试图在 Java SE 中重现以下 HTML 代码:

<form name="form1" method="post" enctype="multipart/form-data" action="http://localhost:50447/api/files/">
<div>
    <label for="image1">Image File</label>
    <input name="image1" type="file" />
</div>
<div>
    <input type="submit" value="Submit" />
</div>

最简单的方法是什么?我想避免使用 Apache .. 比如:

String urlToConnect = "http://localhost:50447/api/files/";
    String paramToSend = "";
    File fileToUpload = new File("C:/Users/aa/Desktop/sample_signed.pdf");
    String boundary = Long.toHexString(System.currentTimeMillis()); // Just generate some unique random value.

    URLConnection connection = null;
    try {
        connection = new URL(urlToConnect).openConnection();
    } catch (IOException e2) {
        // TODO Auto-generated catch block
        e2.printStackTrace();
    }
    connection.setDoOutput(true); // This sets request method to POST.
    connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
    PrintWriter writer = null;
    try {
        writer = new PrintWriter(new OutputStreamWriter(connection.getOutputStream(), "UTF-8"));

        writer.println("--" + boundary);
        writer.println("Content-Disposition: form-data; name=\"paramToSend\"");
        writer.println("Content-Type: text/plain; charset=UTF-8");
        writer.println();
        writer.println(paramToSend);

        writer.println("--" + boundary);
        writer.println("Content-Disposition: form-data; name=\"fileToUpload\"; filename=\"sample_signed.pdf\"");
        writer.println("Content-Type: text/plain; charset=UTF-8");
        writer.println();
        BufferedReader reader = null;
        try {
            try {
                reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileToUpload), "UTF-8"));
            } catch (UnsupportedEncodingException | FileNotFoundException e1) {
                e1.printStackTrace();
            }
            try {
                for (String line; (line = reader.readLine()) != null;) {
                    writer.println(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        } finally {
            if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {}
        }

        writer.println("--" + boundary + "--");
    } catch (UnsupportedEncodingException e2) {

        e2.printStackTrace();
    } catch (IOException e2) {

        e2.printStackTrace();
    } finally {
        if (writer != null) writer.close();
    }

    // Connection is lazily executed whenever you request any status.
    int responseCode = 0;
    try {
        responseCode = ((HttpURLConnection) connection).getResponseCode();
    } catch (IOException e) {
        e.printStackTrace();
    }
    System.out.println(responseCode);

仅使用 URLConnections.. 此代码无法正常工作.. 它发送文件,但丢失了一些内容,我不知道为什么.. 我的 HTML 示例运行良好..

你能帮帮我吗?

感谢您的关注, 最好的问候。

【问题讨论】:

    标签: java html post file-upload


    【解决方案1】:

    在传输二进制数据时,您正在使用读写器组合。处理二进制数据时应该使用流。

    因此,不要使用 BufferedReader,而是使用缓冲的普通 InputStream 来读取文件,并且不要包装从 URLConnection 获得的输出流。

    在读取循环中读取字节而不是字符串。所以替换以 BufferedReader 开头的部分,直到边界写入之前的 finally:

                OutputStream output = connection.getOutputStream();
                InputStream fileIn = new FileInputStream(fileToUpload);
                try {
                    byte[] buffer = new byte[4096];
                    int length;
                    while ((length = fileIn.read(buffer)) > 0) {
                        output.write(buffer, 0, length);
                    }
                    output.flush();
                } finally {
    
                    if (fileIn != null) try { fileIn.close(); } catch (IOException logOrIgnore) {}
                }
    

    【讨论】:

    • 为了不包装输出流,我必须剪掉这个: writer = new PrintWriter(new OutputStreamWriter(connection.getOutputStream(), "UTF-8"));如果这样做,如何将文件字节写入输出流?
    • 我替换了我的代码,但仍然没有运气。我确实维护了 PrintWriter 来编写头文件和边界。我是否也删除了那部分?
    • 你能真正看到服务器端没有收到哪些部件吗?这将有助于查明问题。
    • 此时,服务器端没有收到任何部分。我替换了“BufferedReader reader = null; try { try { reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileToUpload), "UTF-8")); } catch (UnsupportedEncodingException | FileNotFoundException e1) { e1.printStackTrace(); } try { for (String line; (line = reader.readLine()) != null;) { writer.println( line); } " 用于您的代码,现在他没有收到任何部分..
    • 请求到达服务器,但是在搜索文件的时候,却找不到任何一个..
    【解决方案2】:

    解决方案:另一种方法,使用 DataOutputStream。

    FileInputStream fileInputStream = new FileInputStream(absolutePath);
            URL url = new URL("http://localhost:50447/api/files/");
    
            // Open a HTTP  connection to  the URL
            conn = (HttpURLConnection) url.openConnection();
            conn.setDoInput(true); // Allow Inputs
            conn.setDoOutput(true); // Allow Outputs
            conn.setUseCaches(false); // Don't use a Cached Copy
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Connection", "Keep-Alive");
            conn.setRequestProperty("ENCTYPE", "multipart/form-data");
            conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
            conn.setRequestProperty("uploaded_file", filename);
    
            dos = new DataOutputStream(conn.getOutputStream());
    
            dos.writeBytes(twoHyphens + boundary + lineEnd);
            dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\"" + fileName + "\"" + lineEnd);
    
            dos.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) {
    
                dos.write(buffer, 0, bufferSize);
                bytesAvailable = fileInputStream.available();
                bufferSize = Math.min(bytesAvailable, maxBufferSize);
                bytesRead = fileInputStream.read(buffer, 0, bufferSize);  
    
            }
    
            // send multipart form data necesssary after file data...
            dos.writeBytes(lineEnd);
            dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
    
    
            // Responses from the server (code and message)
            serverResponseCode = conn.getResponseCode();
            String serverResponseMessage = conn.getResponseMessage();
            System.out.println(serverResponseMessage);
    
            fileInputStream.close();
            dos.flush();
            dos.close();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 2018-08-10
      • 2014-10-11
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      相关资源
      最近更新 更多