使用Java将文件上载和POST文件到PHP页面

我需要一种方法来上传文件并将其发布到php页面…

我的php页面是:

<?php $maxsize = 10485760; $array_estensioni_ammesse=array('.tmp'); $uploaddir = 'uploads/'; if (is_uploaded_file($_FILES['file']['tmp_name'])) { if($_FILES['file']['size']  

我在我的桌面应用程序中使用这个java代码:

 HttpURLConnection httpUrlConnection = (HttpURLConnection)new URL("http://www.mypage.org/upload.php").openConnection(); httpUrlConnection.setDoOutput(true); httpUrlConnection.setRequestMethod("POST"); OutputStream os = httpUrlConnection.getOutputStream(); Thread.sleep(1000); BufferedInputStream fis = new BufferedInputStream(new FileInputStream("tmpfile.tmp")); for (int i = 0; i < totalByte; i++) { os.write(fis.read()); byteTrasferred = i + 1; } os.close(); BufferedReader in = new BufferedReader( new InputStreamReader( httpUrlConnection.getInputStream())); String s = null; while ((s = in.readLine()) != null) { System.out.println(s); } in.close(); fis.close(); 

但我总是收到“上传失败!!!” 信息。

即使线程很老,可能仍然有人在寻找更简单的方法来解决这个问题(像我:)

经过一些研究,我发现了一种在不改变原始海报的Java代码的情况下上传文件的方法。 您只需使用以下PHP代码:

  

这段代码只是获取java-application发送的原始数据并将其写入文件。 但是有一个问题:你没有得到原始文件名,所以你必须以其他方式传输它。

我通过使用GET参数解决了这个问题,这使得必要的Java代码发生了一些变化:

 HttpURLConnection httpUrlConnection = (HttpURLConnection)new URL("http://www.mypage.org/upload.php").openConnection(); 

改变为

 HttpURLConnection httpUrlConnection = (HttpURLConnection)new URL("http://www.mypage.org/upload.php?filename=abc.def").openConnection(); 

在PHP脚本中,您可以更改该行

 $filename="abc.xyz"; 

 $filename=$_GET['filename']; 

这个解决方案不使用任何外部库,在我看来比其他一些已发布的库更简单…

希望我可以帮助任何人:)

这是一个旧线程,但为了其他人的利益,这里有一个完全正常的例子,正是op要求的:

PHP服务器代码:

  

Java客户端代码:

 import java.io.OutputStream; import java.io.InputStream; import java.net.URLConnection; import java.net.URL; import java.net.Socket; public class Main { private final String CrLf = "\r\n"; public static void main(String[] args) { Main main = new Main(); main.httpConn(); } private void httpConn() { URLConnection conn = null; OutputStream os = null; InputStream is = null; try { URL url = new URL("http://localhost/test/post.php"); System.out.println("url:" + url); conn = url.openConnection(); conn.setDoOutput(true); String postData = ""; InputStream imgIs = getClass().getResourceAsStream("/test.jpg"); byte[] imgData = new byte[imgIs.available()]; imgIs.read(imgData); String message1 = ""; message1 += "-----------------------------4664151417711" + CrLf; message1 += "Content-Disposition: form-data; name=\"uploadedfile\"; filename=\"test.jpg\"" + CrLf; message1 += "Content-Type: image/jpeg" + CrLf; message1 += CrLf; // the image is sent between the messages in the multipart message. String message2 = ""; message2 += CrLf + "-----------------------------4664151417711--" + CrLf; conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=---------------------------4664151417711"); // might not need to specify the content-length when sending chunked // data. conn.setRequestProperty("Content-Length", String.valueOf((message1 .length() + message2.length() + imgData.length))); System.out.println("open os"); os = conn.getOutputStream(); System.out.println(message1); os.write(message1.getBytes()); // SEND THE IMAGE int index = 0; int size = 1024; do { System.out.println("write:" + index); if ((index + size) > imgData.length) { size = imgData.length - index; } os.write(imgData, index, size); index += size; } while (index < imgData.length); System.out.println("written:" + index); System.out.println(message2); os.write(message2.getBytes()); os.flush(); System.out.println("open is"); is = conn.getInputStream(); char buff = 512; int len; byte[] data = new byte[buff]; do { System.out.println("READ"); len = is.read(data); if (len > 0) { System.out.println(new String(data, 0, len)); } } while (len > 0); System.out.println("DONE"); } catch (Exception e) { e.printStackTrace(); } finally { System.out.println("Close connection"); try { os.close(); } catch (Exception e) { } try { is.close(); } catch (Exception e) { } try { } catch (Exception e) { } } } } 

你可以弄清楚如何为你的网站调整它,但我测试了上面的代码,它的工作原理。 我不能相信它虽然>> 见原帖

您需要为PHP使用form-multipart编码的post,以便能够以您尝试的方式阅读它。 这个网站概述了一个很好的方法,并提供了可以帮助你的图书馆链接。

以上所有答案都是100%正确的。 您也可以使用普通套接字,在这种情况下,您的方法将如下所示:

  // Compose the request header StringBuffer buf = new StringBuffer(); buf.append("POST "); buf.append(uploader.getUploadAction()); buf.append(" HTTP/1.1\r\n"); buf.append("Content-Type: multipart/form-data; boundary="); buf.append(boundary); buf.append("\r\n"); buf.append("Host: "); buf.append(uploader.getUploadHost()); buf.append(':'); buf.append(uploader.getUploadPort()); buf.append("\r\n"); buf.append("Connection: close\r\n"); buf.append("Cache-Control: no-cache\r\n"); // Add cookies List cookies = uploader.getCookies(); if (!cookies.isEmpty()) { buf.append("Cookie: "); for (Iterator iterator = cookies.iterator(); iterator.hasNext(); ) { Parameter parameter = (Parameter)iterator.next(); buf.append(parameter.getName()); buf.append('='); buf.append(parameter.getValue()); if (iterator.hasNext()) buf.append("; "); } buf.append("\r\n"); } buf.append("Content-Length: "); // Request body StringBuffer body = new StringBuffer(); List fields = uploader.getFields(); for (Iterator iterator = fields.iterator(); iterator.hasNext();) { Parameter parameter = (Parameter) iterator.next(); body.append("--"); body.append(boundary); body.append("\r\n"); body.append("Content-Disposition: form-data; name=\""); body.append(parameter.getName()); body.append("\"\r\n\r\n"); body.append(parameter.getValue()); body.append("\r\n"); } body.append("--"); body.append(boundary); body.append("\r\n"); body.append("Content-Disposition: form-data; name=\""); body.append(uploader.getImageFieldName()); body.append("\"; filename=\""); body.append(file.getName()); body.append("\"\r\n"); body.append("Content-Type: image/pjpeg\r\n\r\n"); String boundary = "WHATEVERYOURDEARHEARTDESIRES"; String lastBoundary = "\r\n--" + boundary + "--\r\n"; long length = file.length() + (long) lastBoundary.length() + (long) body.length(); long total = buf.length() + body.length(); buf.append(length); buf.append("\r\n\r\n"); // Upload here InetAddress address = InetAddress.getByName(uploader.getUploadHost()); Socket socket = new Socket(address, uploader.getUploadPort()); try { socket.setSoTimeout(60 * 1000); uploadStarted(length); PrintStream out = new PrintStream(new BufferedOutputStream(socket.getOutputStream())); out.print(buf); out.print(body); // Send the file byte[] bytes = new byte[1024 * 65]; int size; InputStream in = new BufferedInputStream(new FileInputStream(file)); try { while ((size = in.read(bytes)) > 0) { total += size; out.write(bytes, 0, size); transferred(total); } } finally { in.close(); } out.print(lastBoundary); out.flush(); // Read the response BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); while (reader.readLine() != null); } finally { socket.close(); } 

您没有使用正确的HTML文件上载语义。 您只是将一堆数据发布到url。

你有两个选择:

  • 您可以按原样保留java代码,并将php代码更改为只读取原始POST作为文件。
  • 更改java代码以使用公共库执行实际文件上载。

我建议更改java代码,以符合标准的方式执行此操作。

我意识到这有点旧,但我刚刚发布了一个类似问题的答案,这个问题也适用于此。 它包含类似于Daniil的代码,但使用HttpURLConnection而不是Socket。