Загрузка и POST-файл на PHP-страницу с помощью Java

Мне нужен способ загрузить файл и отправить его на php-страницу …

Моя страница php:

<?php $maxsize = 10485760; $array_estensioni_ammesse=array('.tmp'); $uploaddir = 'uploads/'; if (is_uploaded_file($_FILES['file']['tmp_name'])) { if($_FILES['file']['size'] <= $maxsize) { $estensione = strtolower(substr($_FILES['file']['name'], strrpos($_FILES['file']['name'], "."), strlen($_FILES['file']['name'])-strrpos($_FILES['file']['name'], "."))); if(!in_array($estensione, $array_estensioni_ammesse)) { echo "File is not valid!\n"; } else { $uploadfile = $uploaddir . basename($_FILES['file']['name']); echo "File ". $_FILES['file']['name'] ." uploaded successfully.\n"; if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) { echo "File is valid, and was successfully moved.\n"; } else print_r($_FILES); } } else echo "File is not valid!\n"; } else { echo "Upload Failed!!!"; print_r($_FILES); } ?> 

и я использую этот 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-Code. Вам просто нужно использовать следующий PHP-код:

 <?php $filename="abc.xyz"; $fileData=file_get_contents('php://input'); $fhandle=fopen($filename, 'wb'); fwrite($fhandle, $fileData); fclose($fhandle); echo("Done uploading"); ?> 

Этот код просто извлекает необработанные данные, отправленные java-приложением, и записывает их в файл. Есть, однако, одна проблема: вы не получаете оригинальное имя файла, поэтому вам нужно передать его каким-то другим образом.

Я решил эту проблему с помощью GET-Parameter, что немного изменило необходимый 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:

 <?php $target_path = "uploads/"; $target_path = $target_path . basename( $_FILES['uploadedfile']['name']); if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { echo "The file ". basename( $_FILES['uploadedfile']['name'])." has been uploaded"; } else{ echo "There was an error uploading the file, please try again!"; } ?> 

Код клиента 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 мог читать его так, как вы пытаетесь, вам нужно использовать форматированный многострочный заголовок. Этот сайт описывает хороший способ сделать это и имеет ссылки на библиотеки, которые могут вам помочь.

Все ответы выше на 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.

У вас есть 2 варианта:

  • Вы можете сохранить java-код как есть и изменить PHP-код, чтобы просто прочитать исходный POST в виде файла.
  • Измените код Java, чтобы сделать реальную загрузку файла, возможно, используя общую библиотеку .

Я бы рекомендовал изменить код Java, чтобы сделать это стандартным образом.

Я понимаю, что это немного устарело, но я только что опубликовал ответ на аналогичный вопрос, который должен быть применим и здесь. Он включает код, похожий на Daniil's, но использует HttpURLConnection вместо Socket.