Java Glassfish-上传图片-正确操作
我使用的是最新的glassfish(3.1.2)——因此不需要ApacheFileItem,getPart()也没有bug。我了解到上传图像的最佳实践是将图像保存在文件系统中(例如,请参阅)。我正在编辑已经存在的代码-闻起来很臭-所以我有了这样的想法:Java Glassfish-上传图片-正确操作,java,servlets,glassfish-3,multipartform-data,servlet-3.0,Java,Servlets,Glassfish 3,Multipartform Data,Servlet 3.0,我使用的是最新的glassfish(3.1.2)——因此不需要ApacheFileItem,getPart()也没有bug。我了解到上传图像的最佳实践是将图像保存在文件系统中(例如,请参阅)。我正在编辑已经存在的代码-闻起来很臭-所以我有了这样的想法: Part p1 = request.getPart("file"); System.out.println("!!!!!P1 : " + p1); 印刷品: !!!!!P1 : File name=DSC03660.JPG, StoreLoc
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;
}
在哪里
现在发生的事情是,在提交表单时,文件被上传到StoreLocation(??),因此显然所有这些p1.getInputStream()
都是无效的
我的问题是:
- 什么是店址?那些glassfish上传的tmp是多少?所有这些参数都设置在哪里?我确实读过BalusC'——但没有提到StoreLocation(谷歌没有太大帮助)
- 如果使用glassfish提供的设施(如果glassfish提供的话),还有什么更专业的方法来处理这种情况呢?包括将照片保存在webroot之外
- 即使p1打印得如此漂亮,我也无法理解(它不需要覆盖
)toString()
好的做法是在文件系统上选择一个上传照片的路径。通常,该路径被编程为可通过java系统属性进行配置(例如:在JVM参数上传递
-Dcom.mycompany.uploadPath=/path/to/photos/dir
系统属性)
您还可以使用java系统属性查找特定于环境的路径:user.dir
、user.home
等。请参阅。或要使用glassfish相对路径,请参见
一旦您引用了,只需执行文件IO即可将上载的文件复制到此上载路径中,例如:
Part part = // obtain part somehow..
String photoFileName = // build a file name somehow..
InputStream photoInputStream = part.getInputStream();
FileOutputStream photoOutputStream = new FileOutputStream(System.getProperty("com.mycompany.uploadPath") + File.separator + photoFileName);
IOUtils.copy(photoInputStream, photoOutputStream);
// close streams here...
上面的代码是为了方便而使用的,但是可以自由编写自己的复制方法。您还应该添加异常处理方法
什么是店址?那些glassfish上传的tmp是多少?所有这些参数都设置在哪里
只是FileItem
的java.io.File对象的
数据在磁盘上的临时位置。驻留在javax.servlet.context.tempdir
中,默认为%GLASSFISH\u HOME%\domains\domain1\generated\jsp\webApp
。这些上传与任何东西一样都是tmp(文件的生存期与FileItem
实例的生存期相关联;当实例被垃圾收集时,文件将被删除。尚未以编程方式更改javax.servlet.context.tempdir
的值(请评论)-它是sun-web.xml的tempdir
属性
如果使用glassfish提供的设施(如果glassfish提供的话),还有什么更专业的方法来处理这种情况呢?包括将照片保存在webroot之外
更专业的方法是使用Part.write()
将文件移动到所需位置。由于glassfish的实现,虽然您不能提供一个绝对的写入路径,但这是一件麻烦事。我问
关于保存文件的位置:
这是为了保存文件-要从应用程序之外的位置提供文件,您需要在sun-web.xml(或glassfish-web.xml)中定义“alternatedocroot”属性
即使p1打印得如此漂亮,我也无法理解(它似乎没有覆盖toString()
哦,是的
对技巧感兴趣,甚至对如何重命名照片等感兴趣(sessionID是正确的吗?——同时检查时间技巧)
不,它不是-我倾向于
文件#createTempFile()
-无论如何,这是一个不同的问题类StoreLocation的完全限定名是什么?看起来不熟悉me@gerrytan:不是一个类-只是部分的toString()中的一个打印输出-将很快更新这个问题-我想我可以回答其中的一些-我现在太忙了看看我的答案-我主要关心的是移动(而不是复制)文件-并弄清楚那些玻璃鱼积垢是什么
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
}
Part part = // obtain part somehow..
String photoFileName = // build a file name somehow..
InputStream photoInputStream = part.getInputStream();
FileOutputStream photoOutputStream = new FileOutputStream(System.getProperty("com.mycompany.uploadPath") + File.separator + photoFileName);
IOUtils.copy(photoInputStream, photoOutputStream);
// close streams here...