2

在花了很多时间阅读文档和在互联网上搜索一些技巧之后,我最终决定创建一个 Stack OverFlow 帐户;看起来很绝望?哈哈,我们走吧。

编辑(2012 年 5 月 16 日):当我找到解决方案时(最终由我自己),我用正在运行的代码替换了旧代码。

我转到 /admin/lstimg (ListImage),它从我的数据库中获取图像 (URL) 记录集合。然后将集合设置为允许我使用 jsp 文件中的数据的属性。

注意:公共类 ListImageServlet 扩展HttpServlet并使用MultipartConfig进行注释。

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException
    {
        try
        {
            Collection images = ImageFacade.getIjc().findImageEntities();
            request.setAttribute("images", images);
            request.getRequestDispatcher("/adm/img/lstimg.jsp").forward(request, response);
        }

        catch (Exception ex)
        {
            Logger.getLogger(ListImageServlet.class.getName()).log(Level.SEVERE, "Cannot retrieve the images.", ex);
        }
    }

在我的 jsp 中,有一个很大的表单(就像我的“图像”集合一样)。在这里,我使用“图像”集合中的数据。对于每个图像,第一列中是缩略图,第二列中是文件输入。我正在尝试通过此(单个)表单执行多个更新。

<form method="post" action="../admin/lstimg" enctype="multipart/form-data">
<table>
    <thead>
        <tr>
            <th>Thumb</th>
            <th>to update</th>
        </tr>
    </thead>
    <tbody>
        <c:forEach items="${images}" var="image">
            <tr>
                <td>
                    <img src="myURL" height="100"/>
                </td>
                <td>
                    <input type="file" name="${image.thumb}"/>
                </td>
            </tr>
        </c:forEach>
    </tbody>
</table>
<input type="submit" value="Proceed" />
</form>

我的第一个问题是:由于我需要新图像具有相同的“image.thumb”(这是密钥),我将文件输入名称设置为当前的“image.thumb”,但我想知道是否,我会在我的计算机上检索我的文件时遇到一些问题?因为我计算机上的文件有自己的路径/文件名,而我服务器上的文件有另一个路径/UUID(密钥)。

编辑(2012 年 5 月 16 日):由于 AWS 不要求提供文件路径(手动设置),因此没有问题。

表单的外观(Web 浏览器

在我选择了我需要更新/更改的图像后,我单击提交按钮(继续)。

  1. 我得到所有零件(文件输入)并将它们存储在集合“allParts”中。
  2. 我检查“allParts”集合的每个部分,如果文件大小在 1b 和 10Mo 之间,则该部分被添加到“selectedParts”集合中。
  3. 在这里,我不知道该怎么做我想做的事……我所有的图像都托管在我的 Amazon S3 服务器中。我使用 Jets3t 工具包。对于第一次上传,我调用 buildPostForm 方法(如下),它会做所有事情。
S3Service.buildPostForm(String bucketName, String key, ProviderCredentials credentials, Date expiration, String[] conditions, String[] inputFields, String textInput, boolean isSecureHttp);

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {
        try
        {
            ImageCheck.initAS3(request);
            ImageCheck.update(request, response);
        } 

        catch (S3ServiceException ex) 
        {
            Logger.getLogger(ListImageServlet.class.getName()).log(Level.SEVERE, null, ex);
        } 

        catch (ServiceException ex) 
        {
            Logger.getLogger(ListImageServlet.class.getName()).log(Level.SEVERE, null, ex);
        } 

        catch (NoSuchAlgorithmException ex) 
        {
            Logger.getLogger(ListImageServlet.class.getName()).log(Level.SEVERE, null, ex);
        } 

        catch (IllegalStateException ex) 
        {
            Logger.getLogger(ListImageServlet.class.getName()).log(Level.SEVERE, null, ex);
        }

        response.sendRedirect("../admin/lstimg");
    }

我的第二个问题是:要通过 servlet 上传/更改文件,因为我使用自己的表单,我需要将文件设置为我的 S3Object,但我不知道我可以用我的“selectedParts”做什么?有没有办法将零件更改为文件?我必须使用 Part 以外的其他东西吗?

编辑(05/16/2012):我的解决方案

对不起我的英语不好。提前感谢您的建议,意见,答案。如果您对代码有任何疑问或需要更多信息,请不要犹豫。

4

2 回答 2

1

我非常专注于S3Object#S3Object(java.io.File)以至于我没有意识到我可以使用StorageObject#setDataInputStream

当我将旧图像密钥设置为新图像密钥时,我的新问题是 Web 浏览器将旧图像保存在缓存中。我在这上面花了很多时间,认为我的功能没有正确运行,即使我什至不知道我可能在哪里犯了错误;但我继续我的 AWS 并检查了已成功更新的“上次修改”值。我清除了缓存,从一开始我就发现一切都很好。

如果它可以帮助一些人,我提供了我所做的允许通过单个表单更改多个 S3Object 的功能。如果您有任何问题、建议或需要对该代码的任何评论,我在这里。

public static void upload(HttpServletRequest request, Part part, S3Service s3Service, S3Bucket s3Bucket) 
        throws S3ServiceException, NoSuchAlgorithmException, IOException
{
    S3Object s3Object = new S3Object();
    s3Object.setDataInputStream(part.getInputStream());
    s3Object.setKey(part.getName());
    s3Object.setContentLength(part.getSize());
    s3Object.setAcl(AccessControlList.REST_CANNED_PUBLIC_READ);
    s3Service.putObject(s3Bucket, s3Object);
}

        public static void update(HttpServletRequest request) 
        throws S3ServiceException, ServiceException, NoSuchAlgorithmException, IOException, IllegalStateException, ServletException
{
    AWSCredentials awsCredentials = (AWSCredentials) request.getSession().getAttribute("awsCredentials");
    S3Service s3Service = (S3Service) request.getSession().getAttribute("s3Service");
    S3Bucket s3Bucket = (S3Bucket) request.getSession().getAttribute("s3Bucket");
    String bucketName = (String) request.getSession().getAttribute("bucketName");

    String prefix = "uploads/";
    String delimiter = null;
    S3Object[] filteredObjects = s3Service.listObjects(bucketName, prefix, delimiter);

    Collection<Part> allParts = request.getParts();
    Collection<Part> selectedParts = new ArrayList<Part>();
    Collection<String> keys = new ArrayList<String>();

    for (Part part : allParts)
    {
        if (part.getSize()>1 && part.getSize()<10485760)
        {
            selectedParts.add(part);
        }
    }

    for (int o = 0; o < filteredObjects.length; o++)
    {
        String keyObject = filteredObjects[o].getName();
        keys.add(keyObject);
    }

    if (selectedParts.size() > 0)
    {
        for (Part part : selectedParts)
        {
            if (keys.contains(part.getName()))
            {
                s3Service.deleteObject(s3Bucket, part.getName());
                upload(request, part, s3Service, s3Bucket);
            }

            else
            {
                selectedParts.remove(part);
            }
        }
    }

    else
    {
        String ex = "No file to update.";
        exceptions.add(ex);
    }
}
于 2012-05-15T15:39:54.540 回答
0

Part. _ 输入字段的名称由 提供Part#getName()

String name = part.getName();

上传文件的内容由Part#getInputStream().

InputStream content = part.getInputStream();

您可以读取它并将其写入任意OutputStream 通常的 Java I/O 方式。例如,一个FileOutputStream. 但是,我不确定您最终需要对File. 如果您的唯一目的是将其存储在数据库中,只需InputStream直接存储而不是先将其保存在磁盘上。

于 2012-05-14T02:34:48.673 回答