私は最新のグラスフィッシュ (3.1.2) を使用しているため、Apache FileItem は必要なく、getPart() のバグもありません。画像をアップロードする際のベスト プラクティスは、ファイル システムに保存することだと読みました (たとえば、こちらを参照)。私は既存のコードを編集しています-それは臭いです-だから私はやるべき考えを持っていました:
Part p1 = request.getPart("file");
System.out.println("!!!!!P1 : " + p1);
版画 :
!!!!!P1 : File name=DSC03660.JPG,
StoreLocation=C:\_\glassfish3\glassfish\domains\domain1\generated\jsp\elkethe\upload_7cb06306_138b413999a__7ffa_00000000.tmp,
size=2589152bytes, isFormField=false, FieldName=file
改行鉱山。人々がやっているコードでは:
if (request.getParameter("crop") != null) {
// get path on the server
String outputpath = this.getServletContext().getRealPath(
"images/temp/" + session.getId() + ".jpg");
// store photo
InputStream is = p1.getInputStream();
createPhoto(is, outputpath);
session.setAttribute("photo_path", "images/temp/" + session.getId()
+ ".jpg");
response.sendRedirect("cropping");
return;
}
どこ
private void createPhoto(InputStream is, String outputpath) {
FileOutputStream os = null;
try {
os = new FileOutputStream(outputpath);
// write bytes taken from uploaded file to target file
int ch = is.read();
while (ch != -1) {
os.write(ch);
ch = is.read();
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
Helpers.close(os);
}
}
何が起こるかというと、フォームの送信時にファイルが StoreLocation (???) にアップロードされるため、明らかにこれ p1.getInputStream()
はすべて無駄です。
私の質問は次のとおりです。
- StoreLocation とは何ですか? これらのグラスフィッシュのアップロードはどのくらいの tmp ですか? これらすべてのパラメータはどこに設定されていますか? BalusC のチュートリアルを読みましたが、StoreLocation についての言及はありません (Google もあまり役に立ちません)。
- 写真をウェブルートの外に保管することを含め、この状況を処理するためのより専門的な方法は何ですか?
- p1 の印刷でさえ、私を逃します (それはOverride のよう
toString()
には見えません) 。
写真などの名前を変更する方法についてもヒントに興味があります(これはsessionIDのことですか?-タイムトリックも確認してください):
if (request.getParameter("save") != null) {
long time = System.currentTimeMillis();
String path = "images/upload/" + session.getId() + time + ".jpg";
String outputpath = this.getServletContext().getRealPath(path);
// store photo
InputStream is = p1.getInputStream();
createPhoto(is, outputpath);
// etc
}