Передача изображений между серверами? - PullRequest
5 голосов
/ 06 июля 2010

У меня есть Java-сервлет, который принимает изображение, которое пользователь загружает в мое веб-приложение.

У меня есть другой сервер (работает php), на котором будут размещены все изображения. Как я могу получить изображение с моего сервера JSP на мой сервер PHP? Поток будет что-то вроде:

public class ServletImgUpload extends HttpServlet 
{   
    public void doPost(HttpServletRequest req, HttpServletResponse resp) 
      throws ServletException, IOException 
    {
        // get image user submitted
        // try sending it to my php server now
        // return success or failure message back to user
    }
}

Спасибо

Ответы [ 5 ]

2 голосов
/ 06 июля 2010

Несколько решений на моей голове ...

  • Используйте HTTP POST для отправки файла. Вероятно, не очень хорошая идея, если файлы большие.
  • Использовать FTP. Это легко дает вам аутентификацию, обработку больших файлов и т. Д. Бонусные баллы за использование SFTP.
  • Используйте программу типа rsync [over ssh] для переноса содержимого каталога с одного сервера на другой. Не очень хорошее решение, если у вас есть проблемы с дисковым пространством, поскольку вы будете хранить одни и те же файлы дважды, по одному на сервер.

Кроме того, не забывайте учитывать, как часто изображения будут передаваться на ваш сервлет. Вы не хотите пытаться удерживать в памяти сотни изображений и сетевые сокеты их переносов - в этом случае сохраните изображения на диск.

0 голосов
/ 07 июля 2010

Зачем загружать?Просто скачайте файл с помощью php file_get_contents ()

При получении файла используйте java для вызова URL, например http://php.example.com/getfile.php?file=file001.jpg

Затем в PHP getfile.php:

$ file =file_get_contents ( 'http://java.example.com/images/file001.jpg');

0 голосов
/ 07 июля 2010

Прежде всего, почему бы вам просто не отправить форму непосредственно в этот скрипт PHP?

<form action="http://example.com/upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit">
</form>

Если это как-то не так, и вам действительно нужно отправить форму сервлету, то сначала создайте форму HTML, как показано в JSP:

<form action="upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit">
</form>

В сервлете, который прослушивает url-pattern из /upload, у вас есть 2 варианта обработки запроса, в зависимости от того, что принимает скрипт PHP.

Если PHP-скрипт принимает те же самые параметры и может обрабатывать загруженный файл так же, как HTML-форма указала сервлету (я все равно предпочел бы просто отправить форму непосредственно в PHP). сценария, но в любом случае), тогда вы можете позволить сервлету играть прозрачный прокси, который просто немедленно передает байты из HTTP-запроса в сценарий PHP. java.net.URLConnection API полезен в этом.

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    HttpURLConnection connection = (HttpURLConnection) new URL("http://example.com/upload.php").openConnection();
    connection.setDoOutput(true); // POST.
    connection.setRequestProperty("Content-Type", request.getHeader("Content-Type")); // This one is important! You may want to check other request headers and copy it as well.

    // Set streaming mode, else HttpURLConnection will buffer everything in Java's memory.
    int contentLength = request.getContentLength();
    if (contentLength > -1) {
        connection.setFixedLengthStreamingMode(contentLength);
     } else {
        connection.setChunkedStreamingMode(1024);
    }

    InputStream input = request.getInputStream();
    OutputStream output = connection.getOutputStream();
    byte[] buffer = new byte[1024]; // Uses only 1KB of memory!
    for (int length = 0; (length = input.read(buffer)) > 0;) {
        output.write(buffer, 0, length);
    }
    output.close();

    InputStream phpResponse = connection.getInputStream(); // Calling getInputStream() is important, it's lazily executed!
    // Do your thing with the PHP response.
}

Если PHP-скрипт принимает другие или другие параметры (опять же, я бы предпочел просто соответствующим образом изменить HTML-форму, чтобы она могла напрямую отправляться в PHP-скрипт), тогда вы можно использовать Apache Commons FileUpload для извлечения загруженного файла и Apache HttpComponents Client для отправки загруженного файла в сценарий PHP, как если бы он был отправлен из HTML-формы.

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    InputStream fileContent = null;
    String fileContentType = null;
    String fileName = null;

    try {
        List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
        for (FileItem item : items) {
            if (!item.isFormField() && item.getFieldName().equals("file")) { // <input type="file" name="file">
                fileContent = item.getInputStream();
                fileContentType = item.getContentType();
                fileName = FilenameUtils.getName(item.getName());
                break; // If there are no other fields?
            }            
        }
    } catch (FileUploadException e) {
        throw new ServletException("Parsing file upload failed.", e);
    }

    if (fileContent != null) {
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost("http://example.com/upload.php");
        MultipartEntity entity = new MultipartEntity();
        entity.addPart("file", new InputStreamBody(fileContent, fileContentType, fileName));
        httpPost.setEntity(entity);
        HttpResponse phpResponse = httpClient.execute(httpPost);
        // Do your thing with the PHP response.
    }
}

Смотри также:

0 голосов
/ 06 июля 2010

Ну, вы можете настроить простой веб-сервис на вашем PHP-сервере, который принимает изображение в качестве пост-загрузки.

После настройки вы можете отправить изображение по почте, используя что-то вроде HttpClient.

0 голосов
/ 06 июля 2010

Для отправляющей части вы можете использовать что-то вроде HttpClient . Вы должны использовать POST-запросы с многочастной «кодировкой» и добавлять части файла .

Поскольку вам нужно отправить его на сервер PHP, я предлагаю вам просто обойти сервлет и вместо этого отправить файл напрямую на сервер PHP или, если это невозможно, просто прокси-запрос на сервер PHP.

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