关于上传图片到服务器的路径问题!请大家帮一下忙

在jsp页面上显示服务器的图片:

<img src="http://www.xxxx.com:serverPort/image/gfan.png"  id="myImg"  title="证件照(反面)" />

 这样显示是没有问题的。

我在jsp页面上传图片到该服务器:

<form name="myform" action="upload!uploadfile" method="post"  enctype="multipart/form-data">
<input type="file" id="filePath" name="filePath"/>
<input type="submit"  id="mysubmit" value="上传"/>
</form>

  action:

package com.zhangying.util;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;

import com.opensymphony.xwork2.ActionSupport;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class FileUpload extends ActionSupport implements ServletRequestAware,ServletResponseAware{

    /**
     * author : Jacen
     * FileUpload Action
     * upload files from localhost to server
     */
    private static final long serialVersionUID = 1L;
    private String filePath;
    private String serverPath;
    private HttpServletResponse response;
    private HttpServletRequest request;
    
    public String uploadfile()
            throws Exception {
        
        System.out.println(filePath);    //参数1:本地文件路径
//      System.out.println(serverPath);  //参数2:要上传的服务器路径
        
        String resultPath = ""; // 上传后图片所在的路径
        FileOutputStream out = null; // 文件输出流
        
        try {     // 验证图片上传的格式是否正确
            File f = new File(filePath);
            if (!f.isFile()) {
                throw new Exception(" f不是图片文件!");
            }
            if (f != null && f.exists()) { // 这里的ImageIO属于java工厂类,在工厂类class里面,调用的System.gc(),频繁调用会造成dump,需要考虑优化
                BufferedImage image = ImageIO.read(f); // 读入文件
                if (image != null) {
                    BufferedImage tag = new BufferedImage(image.getWidth(),
                            image.getHeight(), BufferedImage.TYPE_INT_RGB); // 构造一个类型为预定义图像类型之一的 BufferedImage
                    tag.getGraphics().drawImage(image, 0, 0, image.getWidth(),
                            image.getHeight(), null); // 绘制所需要尺寸大小的图片
                    /*
                     * 以下生成 图片上传后在服务器上的 新路径
                     */
                    int lastLength = filePath.lastIndexOf(".");
                    String imageName="jacen";  //用用户名来作为上传图片的文件名
                    String fileType = filePath.substring(lastLength); // 获取上传图片的类型
                    
                    resultPath = "http://www.gyswad.com:90/developerCerpic/"+ imageName+ fileType;  //图片在服务器上的地址
                    System.out.println(resultPath);
                    /*
                     * 进行图片的绘制
                     */
                    out = new FileOutputStream(resultPath);
                    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
                    JPEGEncodeParam param = encoder
                            .getDefaultJPEGEncodeParam(tag);
                    param.setQuality(0.95f, true); // 95%图像
                    param.setDensityUnit(1); // 像素尺寸单位.像素/英寸
                    param.setXDensity(300); // 水平分辨率
                    param.setYDensity(300); // 垂直分辨率
                    encoder.setJPEGEncodeParam(param);
                    encoder.encode(tag);
                    tag = null;
                }
            }
            f = null;
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            out.close();
            out=null;
        }
//      request.setAttribute("resultPath", resultPath);
//      return resultPath;
        return "success";
    }

    public String getFilePath() {
        return filePath;
    }

    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }

    public String getServerPath() {
        return serverPath;
    }

    public void setServerPath(String serverPath) {
        this.serverPath = serverPath;
    }

    public HttpServletResponse getResponse() {
        return response;
    }

    public void setResponse(HttpServletResponse response) {
        this.response = response;
    }

    public HttpServletRequest getRequest() {
        return request;
    }

    public void setRequest(HttpServletRequest request) {
        this.request = request;
    }

    @Override
    public void setServletResponse(HttpServletResponse arg0) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void setServletRequest(HttpServletRequest arg0) {
        // TODO Auto-generated method stub
        
    }
    
}

  现在报错:说是空指向异常

finally{
            out.close();
            out=null;
        }

我感觉是resultPath<!--上传图片到服务器的路径-->有问题,请各位帮忙看一下,这里的resultPath到底怎么写?还有,如果各位还有什么更好的方法实现图片上传,请指教。本人新手,一切都略知。

控制台打印的错误信息是这样的:

\temp\upload__daca63c_1399f88364d__8000_00000000.tmp
http://www.gyswad.com:90/developerCerpic/jacen.tmp
java.io.FileNotFoundException: http:\www.gyswad.com:90\developerCerpic\jacen.tmp (文件名、目录名或卷标语法不正确。)
    at java.io.FileOutputStream.open(Native Method)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at com.zhangying.util.FileUpload.uploadfile(FileUpload.java:67)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)

 补充:我想将本地图片上传到服务器的d://Apache2.2/temp/image文件夹下面。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5个回答

1、private String filePath; 修改为private File filePath 可以直接得到上传的文件;(注意文件名是一个临时文件名 以tmp结尾)
2、private String filePathFileName 可以得到上传的文件名
3、上传文件后默认放到 javax.servlet.context.tempdir 指定的临时目录中, 可以在struts2配置文件添加struts.multipart.saveDir 来指定临时目录

4、软连接 如web应用/upload -----> /Apache/temp/image
5、rootPath = getServletContext().getRealPath("/upload") 得到upload目录
6、resultPath =rootPath + "/" + filePathFileName;

7、注意上传文件名有重名情况,比如在filePathFileName前边加上时间戳等解决

superjcn
superjcn 貌似很深奥,我研究一下。非常感谢!
大约 8 年之前 回复
jinnianshilongnian
jinnianshilongnian 或者直接就在action里写死了 或者在配置文件中声明路径
大约 8 年之前 回复
jinnianshilongnian
jinnianshilongnian vista及以上系统的mklink命令可以创建文件夹的链接(感觉像是文件夹的映射)。因为是从底层实现文件夹链接,所以这个链接是对应用程序透明的。 (windows 2000,xp,server 2003的相应功能是linkd,这里只说说mklink) 比如,我有一个文件夹叫C:\Program Files,但是c盘空间不多了,就想把一些应用程序转移到d盘,但是直接剪切过去肯定行不通,应用程序会报错,所以首先把C:\Program Files文件夹整个移动(剪切)到d盘,再执行命令: 1 mklink /j "C:\Program Files" "D:\Program Files" 这样c盘下面就会多出一个带快捷方式图标的文件夹,全称就是"C:\Program Files",双击进去其实就转到了D:\Program Files。 而C:\Program Files这个文件夹是对应用程序透明的,也就是说,除了windows自己,应用程序并不知道C:\Program Files下面的东西其实已经转移到d盘了,还当它们仍然在c盘。这样就不影响原来C:\Program Files下的应用程序的使用了。 1,上面建立的链接属于软链接(/j),还有符号链接(/d)和文件的硬链接(/h)。 符号链接和软链接大致相同,区别在于,软链接是绝对路径链接,而符号链接允许相对路径的链接。 比如,分别创建c:\data\tmp的符号链接c:\1和软链接c:\2,那么c:\1指向的就是同级文件夹下的data文件夹下的子文件夹tmp,而c:\2指向的是c:\data\tmp这样的绝对路径。影响就是,如果把c:\1和c:\2这两个文件夹移动到d盘,那d:\1的链接就失效了,而d:\2仍然有效。 文件的硬链接是对文件创建的链接,比如对c:\data\1.txt创建链接c:\data\2.txt,那么这两个文件就是同一个文件的两个等价别名了,相当于是指向同一个硬盘存储空间的两个指针,删除其中任何一个都不影响另一个文件。但是限制就是这种链接不能跨分区。 2,软链接和符号链接不能跨磁盘。 3,这个功能必须是在ntfs文件系统上才能使用。 xp需要去下载mklink 命令
大约 8 年之前 回复
superjcn
superjcn 如果我服务器D:\Apache\temp\image文件夹,用getRealPath("/image")能软连接过去吧?
大约 8 年之前 回复
jinnianshilongnian
jinnianshilongnian 先做好 软链接 ln命令 /upload -----> /Apache/temp/image getRealPath("/upload") 在web应用中会自动得到web应用下的upload 这是相对web应用的路径
大约 8 年之前 回复
superjcn
superjcn 我比较笨,您说的getRealPath("/upload")还是不清楚,她是怎么得到对应的服务器的某一目录的?
大约 8 年之前 回复
request.getRealPath("/");//获取服务器路径比如:D:\apache-tomcat-6.0.20\webapps\demo\这个路径、
//有了这个路径就可以File f=new File(path);
iteye_5246
iteye_5246 能获取web服务器所在的目录,那么就能准确定位所在的盘符,就可以 File f=new File("绝对路径");那么这个file就存在了
大约 8 年之前 回复
superjcn
superjcn 好吧,谢谢您,我先试一下,如果有不懂的再向您请教
大约 8 年之前 回复
iteye_5246
iteye_5246 当然也可以传一个jsp的名字,例如: request.getRealPath("index.jsp");//返回这个jsp的绝对路径。
大约 8 年之前 回复
iteye_5246
iteye_5246 就这样,就这样
大约 8 年之前 回复
superjcn
superjcn request.getRealPath("/")到底怎么用?这是固定格式还是......
大约 8 年之前 回复

这段代码把我看晕了,filePath是字符串?File f = new File(filePath);这啥意思....
上传图片到服务器跟上传文件一样的啊,input type=file浏览文件后,点击提交,然后后台从request中获取流,读流保存文件到服务器目录下

ServletActionContext.getServletContext().getRealPath("/")

建议用Struts2的

在action里定义如下变量,只写

 private File myFile;

private String contentType;

private String fileName;

这三个变量只写set方法
犹其要注意的一点是:路径后面要有"/"结尾,不然找不到路径

superjcn
superjcn 非常感谢!
大约 8 年之前 回复

[quote]String fileType = filePath.substring(lastLength); // 获取上传图片的类型

                resultPath = "http://www.gyswad.com:90/developerCerpic/"+ imageName+ fileType;  //图片在服务器上的地址  
                System.out.println(resultPath); [/quote]

这里面的resultPath变量有问题,Java无法识别HTTP网址格式的文件路径,jinnianshilongnian 说的方法获取Web项目的路径,然后再[code="java"]String path = request.getRealPath("");
File uploadFolder = new File(path + "/upload");
if (!uploadFolder.exists())
uploadFolder.mkdirs();
File file=new File(path + "/upload/" + name);[/code]通过这个路径然后进行文件内容的写入

FangXingXing007
FangXingXing007 要在web环境下运行才可以,否则request无法获取部署包的路径
大约 8 年之前 回复
superjcn
superjcn 您好,按照您说的,我调试了一下,是把图片写在了本项目workspace下的某一个文件夹里面,并且还是临时文件。可还是写不到其他服务器上去。怎么办?
大约 8 年之前 回复
superjcn
superjcn 我试过,这样不行。我也不知道怎么回事?
大约 8 年之前 回复
立即提问
相关内容推荐