在服务器间传输图像?

时间:2010-07-06 16:35:36

标签: php jsp servlets

我有一个java servlet,它接受用户上传到我的网络应用程序的图像。

我有另一台服务器(运行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 个答案:

答案 0 :(得分:2)

我头顶的一些解决方案......

  • 使用HTTP POST发送文件。如果文件很大,可能不是一个好主意。
  • 使用FTP。这很容易为您提供身份验证,处理大型文件等。使用SFTP的加分点。
  • 使用rsync [over ssh]等程序将目录内容从一台服务器迁移到另一台服务器。如果您有磁盘空间问题,那么这不是一个好的解决方案,因为您要存储两次相同的文件,每台服务器一次。

另外,请记住考虑将图像推送到servlet的频率。您不想尝试在内存中保存100个图像及其传输的网络套接字 - 在这种情况下将图像保存到磁盘。

答案 1 :(得分:0)

对于发送部分,您可以使用HttpClient之类的内容。您应该使用具有多部分“编码”的POST请求,并添加file parts

由于您必须将其发送到PHP服务器,我建议您绕过servlet并将文件直接发送到PHP服务器,或者,如果不可能,只需将请求代理到PHP服务器。

答案 2 :(得分:0)

好吧,您可以在PHP服务器上设置一个简单的Web服务,该服务接受作为上传后的图像。

完成设置后,您可以使用HttpClient之类的内容通过帖子发送图片。

答案 3 :(得分:0)

首先,为什么不直接将表单提交给该PHP脚本?

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

如果这不是一个选项,你真的需要将表单提交给servlet,那么首先在JSP中创建一个HTML表单如下:

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

在监听url-pattern /upload的servlet中,您有2个选项来处理请求,具体取决于PHP脚本的用途。

如果PHP脚本采用相同的参数并且可以像HTML表单指示servlet一样处理上传的文件(我仍然宁愿让表单直接提交给PHP脚本,但无论如何),然后您可以让servlet播放透明代理,它只是立即将字节从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.
    }
}

另见:

答案 4 :(得分:0)

为什么要上传? 只需使用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');