Как отправить локальный файл .png в файл .php на сервер с помощью Java-приложения? - PullRequest
0 голосов
/ 03 августа 2011

У меня есть локальный файл .png, который я хочу отправить с использованием данных POST в скрипт .php, который сохранит данные в файл .png на сервере. Как мне это сделать? Должен ли я кодировать или что-то? Все, что у меня есть, это файл и способ размещения данных.

Вот как я отправляю .png:

public static byte[] imageToByte(File file) throws FileNotFoundException {
    FileInputStream fis = new FileInputStream(file);
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    byte[] buf = new byte[1024];
    try {
        for (int readNum; (readNum = fis.read(buf)) != -1;) {
            bos.write(buf, 0, readNum);
        }
    } catch (IOException ex) {
    }
    byte[] bytes = bos.toByteArray();
    return bytes;
}

public static void sendPostData(String url, HashMap<String, String> data)
        throws Exception {
    URL siteUrl = new URL(url);
    HttpURLConnection conn = (HttpURLConnection) siteUrl.openConnection();
    conn.setRequestMethod("POST");
    conn.setDoOutput(true);
    conn.setDoInput(true);

    DataOutputStream out = new DataOutputStream(conn.getOutputStream());

    Set keys = data.keySet();
    Iterator keyIter = keys.iterator();
    String content = "";
    for (int i = 0; keyIter.hasNext(); i++) {
        Object key = keyIter.next();
        if (i != 0) {
            content += "&";
        }
        content += key + "=" + URLEncoder.encode(data.get(key), "UTF-8");
    }
    System.out.println(content);
    out.writeBytes(content);
    out.flush();
    out.close();
    BufferedReader in = new BufferedReader(new InputStreamReader(
            conn.getInputStream()));
    String line = "";
    while ((line = in.readLine()) != null) {
        System.out.println(line);
    }
    in.close();
}

PHP-скрипт:

<? 
// Config
$uploadBase = "../screenshots/";
$uploadFilename = $_GET['user'] . ".png";
$uploadPath = $uploadBase . $uploadFilename;

// Upload directory
if(!is_dir($uploadBase))
mkdir($uploadBase);

// Grab the data
$incomingData = $_POST['img'];

// Valid data?
if(!$incomingData || !isset($_POST['img']))
die("No input data");

// Write to disk
$fh = fopen($uploadPath, 'w') or die("Error opening file");
fwrite($fh, $incomingData) or die("Error writing to file");
fclose($fh) or die("Error closing file");

echo "Success";
 ?>

Ответы [ 2 ]

0 голосов
/ 04 августа 2011

Должен признать, я удивлен, что вы почти получили правильный файл.На самом деле, когда вы отправляете файл с помощью браузера, тег формы имеет определенную кодировку: enctype="multipart/form-data".Я не знаю, как это работает (это определено в http://tools.ietf.org/html/rfc2388),, но оно включает в себя кодирование файла (например, в Base64). В любом случае, вы можете забыть о внутренностях, если вы используете клиентскую библиотеку http, такую ​​какодин из Apache HttpComponents

0 голосов
/ 04 августа 2011

Мой минималистичный код работает:

$body = file_get_contents('php://input');
$fh = fopen('file.txt', 'w') or die("Error opening fil
e");
fwrite($fh, $body) or die("Error writing to file");
fclose($fh)

curl --upload-file download.txt http://example.com/upload.php

Однако установите метод на PUT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...