Java Glassfish-上传图片-正确操作

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

我使用的是最新的glassfish(3.1.2)——因此不需要ApacheFileItem,getPart()也没有bug。我了解到上传图像的最佳实践是将图像保存在文件系统中(例如,请参阅)。我正在编辑已经存在的代码-闻起来很臭-所以我有了这样的想法:

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()
对如何重命名照片等技巧感兴趣(sessionID是正确的吗?——同时查看时间技巧):


好的做法是在文件系统上选择一个上传照片的路径。通常,该路径被编程为可通过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...