Liferayのアップロードとダウンロード


一、Liferayのアップロード
Liferayのアップロードは普通のStrutsのアップロードと少し違いますので、ここでその過程を紹介します.
ファイルをアップロードする際、formの提出方式に注意し、StrutsPortletを採用しているので、PortletActionのプロセスアクション()メソッド内で処理しなければなりません.そうしないと、提出するデータが得られません(通常のStrutsのACTION内で実行可能かどうか、まだ試していません)、異なる方法で提出すると異なるメソッドに入ります.PortletActionのプロセスアクション()メソッドにコミットを入れるには、formをコミットするときに2つの選択肢があります.
1.
<form method="post" 
id="fileUp" 
action="<portlet:actionURL
windowState="<%= WindowState.MAXIMIZED.toString() %>">
<portlet:param 
name="struts_action" value="" />
<portlet:param 
name="tabs1" value="${tabs1}"/></portlet:actionURL>" 
enctype="multipart/form-data"
method="post" name="<portlet:namespace />fm">

いくつか注意したいことがありますが、まずこの時点で提出されたmethod=「post」です.
次にenctype=「multipart/form-data」これはファイルをアップロードする基本的なステップです.
ポイントはportlet:actionURLですが、PortletActionのプロセスアクション()を実行するためには、actionURLでコミットする必要があります.
2.
2つ目のコミット方法は、1つ目よりも簡単です.
<html:form
action="/?actionURL=true&tabs1=${tabs1}">
</html:form>

ActionURL=trueは、formのコミット時にPortletActionを実行するprocessAction()メソッドを保証します.もちろんenctype=「multipart/form-data」は加算されますが、method=「post」はhtml:formのデフォルトのコミット方式がpostであるため、不要です.Strutsを使用している場合、ActionFormは比較的簡単で、対応するFormFileを追加するだけでよいので、processAction()メソッド内でファイルをアップロードするキーコードについて説明します.
FormFile formFile = Form.getFormFile();
String fileName = formFile.getFileName();
byte[] bytes = formFile.getFileData();
//path        
File uploadedFile = new File(path,fileName);
RandomAccessFile raf = new RandomAccessFile(uploadedFile,"rw");
raf.write(bytes);
raf.close();

上のpath現在のプロジェクトディレクトリに指定する場合は、caller/attachmentsなどのプロジェクトディレクトリの下に新しいフォルダを作成できます.callerはプロジェクト名を指し、pathに
caller/attachments、これでいいです.
String path =
 this.servlet.getServletContext().getRealPath("/attachments");

アップロードファイルが大きくなければ、データベースに存在するほうがいいです.そうすると、アップロードファイルの管理が便利になります.
もう一つの問題は、アップロードファイル自体とは関係ありませんが、アップロードファイルによるものです.それは、アップロード後どうやってジャンプすればいいのでしょうか.プロセスアクション()はActionForwardではなく空を返します.
ジャンプ方式は2種類ありますが、
ActionForwardによるジャンプ
この方式は比較的簡単で、processAction()内に入ってforwardを設定すればよい.具体的なコードは以下の通りである.
this.setForward(request, "portlet.pagination.hello");

アクションジャンプ
一般的にアップロードするとクエリーが再実行されるので、別のアクションを実行する可能性が高く、別のアクションにジャンプする方法も2つあります.1つはActionForwardの名前を直接Actionと書くpath(この方法は複雑ですが、興味があるのは検討してみてください.まずforwardのnameがpathと同じでなければならないこと、redirect=trueのようなものがあること)を要求し、もう1つは直接processAction()の方法で処理します.
PortletURL portletURL = 
((ActionResponseImpl)response).createRenderURL();
portletURL.setParameter("struts_action", "");
portletURL.setParameter("tabs1", "");
response.sendRedirect(portletURL.toString());

ここで、liferayのアップロードについては基本的に説明しましたが、通常のActionのアップロード方式をそのまま採用すれば可能であるはずです(その原理も同じです)が、それではAction内部でliferayのリソースを引用することはできないので注意してください.
liferayのダウンロード
Liferayのダウンロードは比較的簡単で、いくつかの詳細に注意すればいいです.例えば、超接続のコードがあります.
<html:link action="?actionURL=true&windowState=${state}&fileName=${message.remark}">
	   
</html:link>

ここで唯一注目すべきはwindowState=${state}であり、このリンクを開いた状態を示し、stateの値は次のように定義されています.
String state = LiferayWindowState.EXCLUSIVE.toString();

Actionの具体的な処理手順も簡単で、以下にキーコードをリストします.

String fileName = ParamUtil.getString(req, "fileName");
//     request.getParameter("")        
File file = new File(filePath, fileName);
if (file.exists()) {
InputStream fis = null;
try {
fis = new FileInputStream(file);
ServletResponseUtil.sendFile(((ActionResponseImpl) res)
						.getHttpServletResponse(), fileName, fis);
				this.setForward(req, forward);
			} catch (Exception e) {
				System.err.println(fileName + " is not exist!");
			}finally {
				ServletResponseUtil.cleanUp(fis);
			}
		}

ここでfile Pathとは、ファイルが格納されているパスを指します.一つ注意したいのは、ダウンロード時に中国語のファイル名が文字化けしてしまう問題があることです.catalina.batファイルには次のコードがあります(属性が多少異なる場合があります).
set JAVA_OPTS=
-Xms128m -Xmx768m -XX:MaxPermSize=128m
-Dfile.encoding=UTF8
-Duser.timezone=GMT+8 -Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.config
保証ファイルコードはUTF 8であれば良いのですが、GBKであればAction内でファイル名に対応したトランスコードが必要です.
これでliferayのダウンロードは終わり、struts自体もダウンロードのためのActionがあることに注意してください.
覚えているならStruts 1にあるはずです.2.6更新の、それはDownloadActionで、その機能は比較的に完備して、比較的に使いやすくて、これはStrutsの知識に属するため、ここで紹介しないで、ネット上でもこの方面の紹介がたくさんあると信じています.