2

ドキュメントを読んだり、インターネットでいくつかのヒントを検索したりするのに何時間も費やした後、私はついにStackOverFlowアカウントを作成することにしました。必死に見えますか?はは、行きましょう。

編集(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には、大きなフォームがあります(私の「画像」コレクションがそうであるように)。ここでは、「画像」コレクションのデータを使用します。画像ごとに、最初の列にサムネイル、2番目の列にファイル入力があります。この(単一の)フォームを介して複数の更新を実行しようとしています。

<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. ここでは、やりたいことを行う方法がわかりません...すべての画像はAmazonS3サーバーでホストされています。Jets3tToolkitを使用しています。最初のアップロードでは、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");
    }

2番目の質問は、サーブレットを介してファイルをアップロード/変更するには、独自のフォームを使用するため、ファイルをS3Objectに設定する必要がありますが、「selectedParts」で何ができるかわかりません。パーツをファイルに変更する方法はありますか?Part以外のものを使用する必要がありますか?

編集(2012年5月16日):私の解決策

英語でごめんなさい。あなたの提案、アドバイス、答えを事前に感謝します。コードに関して質問がある場合、またはさらに必要な場合は、遠慮なく。

4

2 に答える 2

1

私はS3Object#S3Object(java.io.File)に集中していたので、StorageObject# setDataInputStreamを使用できることに気づきませんでした。

古い画像キーを新しい画像キーに設定すると、新しい問題は、古い画像をキャッシュに保持するWebブラウザです。どこで間違いを犯したのかさえわからなくても、関数が正しく実行されていないと思って、これに多くの時間を費やしました。しかし、AWSにアクセスして、正常に更新された「LastModified」値を確認しました。キャッシュをクリアしたところ、最初からすべてが問題ないことがわかりました。

それがいくつかの助けになるなら、私は単一のフォームを通していくつかの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

これがのjavadocですPart。入力フィールドの名前は、で使用できますPart#getName()

String name = part.getName();

アップロードされたファイルのコンテンツは、によって利用可能ですPart#getInputStream()

InputStream content = part.getInputStream();

あなたはそれを読んで、それを任意OutputStream の通常のJava I/Oの方法で書くことができます。たとえば、FileOutputStream。ただし、最終的に何をする必要があるのか​​わかりませんFile。DBに保存することが唯一の目的である場合は、InputStream最初にディスクに保存するのではなく、直接保存してください。

于 2012-05-14T02:34:48.673 に答える