4

我在最新的 glassfish (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 ?那些 glassfish 上传的 tmp 是多少?所有这些参数在哪里设置?我确实阅读了 BalusC 的教程——但没有提到 StoreLocation(谷歌也不很有帮助)。
  • 处理这种情况的更专业的方法是什么 - 包括将照片保留在 webroot 之外 - 但使用 glassfish 提供的设施(如果它提供的话)?
  • 即使 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
}
4

2 回答 2

0

好的做法是在文件系统上选择上传照片的路径。通常,此路径被编程为可通过 java 系统属性进行配置(例如:通过-Dcom.mycompany.uploadPath=/path/to/photos/dir在 JVM 参数上传递系统属性)。

您还可以使用 java 系统属性来查找特定于环境的路径:user.diruser.home。请参阅Java SE 教程中的系统属性。或者要使用 glassfish 相对路径,请参阅glassfish 系统属性

一旦你参考了Part,它只是做文件 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...

上面的代码为了方便起见使用了apache IOUtils,但您可以随意编写自己的复制方法。您还应该添加异常处理方法

于 2013-09-30T23:47:50.087 回答
0

什么是 StoreLocation ?那些 glassfish 上传的 tmp 是多少?所有这些参数在哪里设置?

StoreLocation只是FileItem' 数据在磁盘上的临时位置的 java.io.File 对象。驻留在javax.servlet.context.tempdir默认为%GLASSFISH_HOME%\domains\domain1\generated\jsp\webApp. 这些上传与任何东西一样 tmp (文件的生命周期与FileItem实例的生命周期相关;当实例被垃圾收集时,文件将被删除- 从这里开始)。尚未设法以javax.servlet.context.tempdir编程方式更改值(请发表评论) - 它是sun-web.xml的sun-web-app 元素tempdir的属性。

处理这种情况的更专业的方法是什么 - 包括将照片保留在 webroot 之外 - 但使用 glassfish 提供的设施(如果它提供的话)?

那么更专业的方法是使用Part.write()将文件移动到所需位置。由于 glassfish 的实现,尽管您无法提供绝对的写入路径 - 一件苦差事。我在这里问。

至于保存文件的位置:https ://stackoverflow.com/a/18664715/281545

这是为了保存文件 - 要从应用程序外部的位置提供文件,您需要在 sun-web.xml(或 glassfish-web.xml)中定义“alternatedocroot”属性。

甚至 p1 打印这么好也让我无法理解(它似乎没有覆盖 toString())

,是的

甚至对如何重命名照片等提示感兴趣(这个 sessionID 是正确的吗? - 还要检查时间技巧)

不,不是-我倾向于-无论如何,这是在这里File#createTempFile()提出的另一个问题

于 2013-11-02T16:02:59.783 回答