java - Glassfish - 上传图片 - 做对了

标签 java servlets glassfish-3 multipartform-data servlet-3.0

我使用的是最新的 glassfish (3.1.2) - 因此不需要 apache FileItem 并且 getPart() 没有错误。我读到上传图像的最佳做法是将它们保存在文件系统中(例如,参见 here)。我正在编辑已经存在的代码 - 那样很臭 - 所以我有了这样做的想法:

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' tutorial - 但没有提及 StoreLocation(谷歌不是很有帮助 either )。
  • 处理这种情况的更专业方法是什么 - 包括将照片保存在 webroot 之外 - 但使用 glassfish 提供的设施(如果它确实提供)?
  • 即使 p1 打印这么好我也逃脱了(它不会 seem 来覆盖 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
}

最佳答案

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

您还可以使用 java 系统属性来查找环境特定路径:user.diruser.home 等。参见 System Properties on Java SE Tutorial .或者要使用 glassfish 相对路径,请参阅 glassfish system properties .

一旦您引用了Part ,就是做文件IO把上传的文件复制到这个上传路径,eg:

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为了方便起见,您可以随意编写自己的复制方法。您还应该添加异常处理方法

关于java - Glassfish - 上传图片 - 做对了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11615832/

相关文章:

java - Spring url 映射不起作用

java.lang.NoClassDefFoundError : org/apache/http/client/HttpClient

java - glassfish部署错误

jakarta-ee - Glassfish @RolesAllowed 与自定义 SecurityContext

java - 所有类的类声明、构造函数和 toString 方法

java - 逐个字符处理字符串并提取信息。如何避免嵌套 if 语句?

java - 将二进制转换为 int 并询问用户是否要重试

java - 如何定义具有可变属性的类?

java - GF3 (JDK 6) 如何配置安全协议(protocol)以删除过时的密码