2012-05-14 16 views
2

文書を読み込んでインターネット上のヒントを検索するのに何時間も費やした結果、最終的にStack OverFlowアカウントを作成することにしました。必死に見える?ハハ、行こう。部品を使用したAmazon S3複数のファイルのアップロード

EDIT(05/16/2012):解決策が見つかったので(私自身が最後に)、私は古いコードを実行コードに置き換えました。

私はデータベースからイメージ(URL)レコードコレクションを取得する/ admin/lstimg(ListImage)に行きます。その後、コレクションは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には、大きなフォームがあります(「画像」コレクションがあります)。ここでは、 "images"コレクションのデータを使用します。各画像について、第1列ではサムネイル、第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(Key)を持っています。

EDIT(05/16/2012):AWSは(手動で設定する)ファイルパスを要求しないため、この問題は発生しません。

どのように形に見える(Web Browser

私は/変更を更新する必要があるイメージ(複数可)を選びました後、私は(続行)送信ボタンをクリックしてください。

  1. すべてのパーツ(ファイル入力)を取得し、それらを「allParts」コレクションに格納します。
  2. "allParts"コレクションのすべての部分をチェックします。ファイルサイズが1b〜10Moの場合、その部分は "selectedParts"コレクションに追加されます。
  3. ここでは、私がやりたいことをする方法がわかりません...私のすべての画像はAmazon S3 Serverでホストされています。私はJets3t Toolkitを使用します。最初のアップロードでは、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以外のものを使わなければならないのですか?

EDIT(2012年5月16日):私の英語のためのMy solution

申し訳ありません。 あなたの提案、アドバイス、回答をお寄せいただきありがとうございます。 コードに関するご質問がある場合や、もう少し必要な場合は、お気軽にお問い合わせください。

答えて

1

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

古い画像キーを新しい画像キーに設定すると、私の新しい問題は古い画像をキャッシュに保存するWebブラウザです。私は、私が間違いを犯した可能性がある場所がわからなくても、私の機能が正しく動作していないと思って、これに多くの時間を費やしました。私はAWSに行き、正常に更新された 'Last Modified'値を確認しました。私はキャッシュをクリアし、すべてが最初から大丈夫だと分かった。

いくつかの助けになるなら、私はいくつかの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); 
    } 
} 
0

javadocPartです。入力フィールドの名前はPart#getName()です。

String name = part.getName(); 

アップロードされたファイルの内容はPart#getInputStream()です。

InputStream content = part.getInputStream(); 

あなたはそれを読み、任意OutputStreamthe usual Java I/O wayにそれを書き込むことができます。たとえば、FileOutputStreamです。しかし、あなたが最終的にはFileで何をする必要があるかわかりません。あなたの唯一の目的がDBに格納することであるならば、最初にディスクに保存するのではなく、InputStreamを直接保存してください。

+0

私はすでにこれを試しましたが、私のIS/OS(最終的には 'File'を得るために)をどうするべきか分かりません。私はこれを前に使ったことはありません...私はたくさんのことを試みましたが、すべてが失敗しました。 私のDBにはS3Object Keyだけがあり、私のAS3Sから簡単にイメージを取得できます。私が言ったように、私のすべてのイメージは、私のAmazon S3 Serverに保存されています(または新しいもの用です)。私の 'S3Bucket'に' S3Object'を格納するためには、 'File'をそれに"設定 "しなければなりません。だからこそ私は1つ必要です。 'public S3Object(java.io.File file)はjava.security.NoSuchAlgorithmException、java.io.IOException'をスローします。 – ltin

関連する問題