NutzCN Logo
问答 图片上传路径找不到 怎么将文件 写入 tomcat容器的某个文件夹
发布于 3049天前 作者 Hamming 4323 次浏览 复制 上一个帖子 下一个帖子
标签:

上传图片的设置
我想设置图片上传位置 比如 /user/userid
现在 图片上传上去 位置在哪我都找不到。图片名称叫good.png
输入地址 找不到
http://localhost:8080/WEB-INF/tmp/good.png
怎么将文件 写入 tomcat容器的某个文件夹

/**
 * Created by Administrator on 2016/8/18.
 */

var ioc = {
     utils : {
     type : 'nuoshang.bluejay.util.ImgUtils',
     fields : {
     sc : {app:'$servlet'}   // 将 ServletContext 对象注入 MyUtils
     }
     },

     tmpFilePool : {
     type : 'org.nutz.filepool.NutFilePool',
     args : [ {java:'$utils.getPath("/WEB-INF/tmp")'}, 1000 ]   // 调用 MyUtils.getPath 函数
     },

    //tmpFilePool : {
    //    type : 'org.nutz.filepool.NutFilePool',
    //    // 临时文件最大个数为 1000 个
    //    args : [ "${app.root}/WEB-INF/tmps", 1000 ]
    //},
    uploadFileContext : {
        type : 'org.nutz.mvc.upload.UploadingContext',
        singleton : false,
        args : [ { refer : 'tmpFilePool' } ],
        fields : {
            // 是否忽略空文件, 默认为 false
            ignoreNull : true,
            // 单个文件最大尺寸(大约的值,单位为字节,即 1048576 为 1M)
            maxFileSize : 1048576,
            // 正则表达式匹配可以支持的文件名
            nameFilter : '^(.+[.])(gif|jpg|png)$'
        }
    },
    myUpload : {
        type : 'org.nutz.mvc.upload.UploadAdaptor',
        singleton : false,
        args : [ { refer : 'uploadFileContext' } ]
    }
};
25 回复

首先, 必须明白一个事: 那是**临时**文件夹!!! 那是**临时**文件夹!!! 那是**临时**文件夹!!!

在入口方法用TempFile接收后, 自行用代码移动到**其他**的目录去.

TempFile有getInputStream(推荐)和getFile(废弃),均可读取上传文件的数据.

@wendal 能不能举个例子 java文件写入这个方面 没写过 求赐教 求判断 求指点

示例代码:

public xxxxxxx(@Param("file")TempFile f, @Attr("me")User user) {
        String path = Mvcs.getServletContext().getRealPath("/") + "/asserts/user/" + user.getId() + ".jpg"; // 更常规的做法是通过配置文件来确定目标路径.
        Files.write(path, f.getInputStream()); // 写入流.
}

@wendal 不行啊

2016-08-18 16:27:34,097 [qtp22805895-21] DEBUG org.nutz.mvc.upload.FastUploading - Found a param, name=[userId] value=[123456]
2016-08-18 16:27:34,097 [qtp22805895-21] DEBUG org.nutz.mvc.upload.FastUploading - ...Done 220275 bytes readed
2016-08-18 16:29:03,788 [qtp22805895-21] WARN  org.nutz.mvc.impl.processor.FailProcessor - Error@/img/uploadPhoto :
java.io.FileNotFoundException: E:\project\bluejay\src\main\webapp\asserts\user\123456\good.png (系统找不到指定的路径。)
	at java.io.FileOutputStream.open0(Native Method)
	at java.io.FileOutputStream.open(FileOutputStream.java:270)
	at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
	at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
	at nuoshang.bluejay.modules.ImgModule.uploadPhoto(ImgModule.java:76)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.nutz.mvc.impl.processor.MethodInvokeProcessor.process(MethodInvokeProcessor.java:25)
	at org.nutz.mvc.impl.processor.AbstractProcessor.doNext(AbstractProcessor.java:44)
	at org.nutz.mvc.impl.processor.AdaptorProcessor.process(AdaptorProcessor.java:33)
	at org.nutz.mvc.impl.processor.AbstractProcessor.doNext(AbstractProcessor.java:44)
	at org.nutz.mvc.impl.processor.ActionFiltersProcessor.process(ActionFiltersProcessor.java:58)
	at org.nutz.mvc.impl.processor.AbstractProcessor.doNext(AbstractProcessor.java:44)
	at org.nutz.mvc.impl.processor.ModuleProcessor.process(ModuleProcessor.java:123)
	at org.nutz.mvc.impl.processor.AbstractProcessor.doNext(AbstractProcessor.java:44)
	at org.nutz.mvc.impl.processor.EncodingProcessor.process(EncodingProcessor.java:27)
	at org.nutz.mvc.impl.processor.AbstractProcessor.doNext(AbstractProcessor.java:44)

@tonyyule 我给你的代码里面哪里有FileOutputStream啊,父文件夹要自己建啊,如果用它的话。

来自炫酷的 NutzCN

Files.write(path, f.getInputStream()); // 写入流.

Error:(73, 22) java: 对于write(java.lang.String,java.io.InputStream), 找不到合适的方法
    方法 java.nio.file.Files.write(java.nio.file.Path,byte[],java.nio.file.OpenOption...)不适用
      (参数不匹配; java.lang.String无法转换为java.nio.file.Path)
    方法 java.nio.file.Files.write(java.nio.file.Path,java.lang.Iterable<? extends java.lang.CharSequence>,java.nio.charset.Charset,java.nio.file.OpenOption...)不适用
      (参数不匹配; java.lang.String无法转换为java.nio.file.Path)
    方法 java.nio.file.Files.write(java.nio.file.Path,java.lang.Iterable<? extends java.lang.CharSequence>,java.nio.file.OpenOption...)不适用
      (参数不匹配; java.lang.String无法转换为java.nio.file.Path)

@wendal

Error:(73, 22) java: 对于write(java.lang.String,java.io.InputStream), 找不到合适的方法
    方法 java.nio.file.Files.write(java.nio.file.Path,byte[],java.nio.file.OpenOption...)不适用
      (参数不匹配; java.lang.String无法转换为java.nio.file.Path)
    方法 java.nio.file.Files.write(java.nio.file.Path,java.lang.Iterable<? extends java.lang.CharSequence>,java.nio.charset.Charset,java.nio.file.OpenOption...)不适用
      (参数不匹配; java.lang.String无法转换为java.nio.file.Path)
    方法 java.nio.file.Files.write(java.nio.file.Path,java.lang.Iterable<? extends java.lang.CharSequence>,java.nio.file.OpenOption...)不适用
      (参数不匹配; java.lang.String无法转换为java.nio.file.Path)

是nutz提供的Files类,不是jdk提供的那个

来自炫酷的 NutzCN

@wendal 如何通过配置文件来确定上传文件的路径呢 如果不放到 tomcat容器内 其它目录 tomcat 改怎么访问呢

@tonyyule 开发环境用入口方法中转, 生产环境上用nginx实现动静分离.

@wendal
开发环境用入口方法中转 是配置tomcat吗

<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">

     <Context docBase="weibo" path="/weibo" reloadable="true" source="org.eclipse.jst.jee.server:weibo"/>
          <!-- 设置图片虚拟路径[访问时路径为/static_img] -->
     <Context path="/static_img" docBase="F:\temp" reloadable="false" />
</Host>
<!-- 也可以这样设置图片虚拟路径 -->
<Host name="10.0.0.123" appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">

	 <Context path="" docBase="F:\temp" reloadable="false" ></Context>
</Host>

nginx 这个 动静分离 不是很明白

@Wizzercn 1.server.xml
打开Tomcat目录下的/conf/server.xml文件,在Host之前加入下面内容。

<Host name="localhost" appBase="webapps"
 unpackWARs="true" autoDeploy="true">
 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
 prefix="localhost_access_log." suffix=".txt"
 pattern="%h %l %u %t &quot;%r&quot; %s %b" />
 
 <Context path="/upload/image" docBase="/opt/image" reloadable="true" debug="0"/>
</Host>
  1. web.xml
    打开Tomcat目录下的/conf/web.xml
<servlet>
 <servlet-name>default</servlet-name>
 <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
 <init-param>
 <param-name>debug</param-name>
 <param-value>0</param-value>
 </init-param>
 <init-param>
 <param-name>listings</param-name>
 <param-value>true</param-value>
 </init-param>
 <load-on-startup>1</load-on-startup>
 </servlet>

为何 我在浏览器 访问还是不能访问图片地址呢
http://192.168.1.127/bluejay/upload/image/20160819/tigvcb7n7cj2srvgb31vah9288.png

@wendal 我用方法中转了 为何 我在浏览器 访问还是不能访问图片地址呢

我指的入口方法是这样:

	@Ok("raw:jpg")
	@At("/upload/?/?")
	@Fail("http:404")
	public Object image(String p, String p2) throws IOException {
		if ((p + p2).contains(".."))
			return HttpStatusView.HTTP_404;
		File f = new File(imageDir, p + "/" + p2 + ".jpg");
		return f;
	}

@wendal imageDir是什么 提示错误

路径, 例如 "/opt/yvr"

@wendal

                String p = Globals.AppRoot;
                String f = Globals.AppUploadPath + "/image/" + DateUtil.format(new Date(), "yyyyMMdd") + "/" + R.UU32() + tf.getSubmittedFileName().substring(tf.getSubmittedFileName().indexOf("."));
                Files.write(new File(p + f), tf.getInputStream());

这样写 图片上传的是PNG 类型 要怎么变成jpg呢
直接改后缀 会不会出错

我晕, 死脑筋啊, 自己改成需要的啊!!!

@wendal

package nuoshang.bluejay.modules;

import nuoshang.bluejay.base.Globals;
import nuoshang.bluejay.base.Result;
import nuoshang.bluejay.base.exception.AppRuntimeException;
import nuoshang.bluejay.bean.Image;
import nuoshang.bluejay.services.ImgService;
import nuoshang.bluejay.util.DateUtil;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Files;
import org.nutz.lang.random.R;
import org.nutz.lang.util.NutMap;
import org.nutz.log.Log;
import org.nutz.log.Logs;
import org.nutz.mvc.annotation.*;
import org.nutz.mvc.impl.AdaptorErrorContext;
import org.nutz.mvc.upload.TempFile;
import org.nutz.mvc.upload.UploadAdaptor;
import org.nutz.mvc.view.HttpStatusView;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.Date;
/**
 * Created by Administrator on 2016/8/18.
 */
@IocBean
@At("/img")
@Fail("http:500")
public class ImgModule {
    private static final Log log = Logs.get();

    @Inject
    protected ImgService imgService;

    @At
    @Ok("json")
    public Object add(@Param("::img.") Image img){
        NutMap re = new NutMap();
        if(img == null){
            return re.addv("ok", false).addv("msg", "参数错误").addv("result", "03");
        }
        try {
            imgService.Save(img);
        } catch (AppRuntimeException e) {
            return re.addv("ok", false).addv("msg", e.getMessage()).addv("result", "02");
        }
        return re.addv("ok", true).addv("result", "01");
    }

    @At
    @Ok("json")
    public Object List(){

        return null;
    }


    @At
    @Ok("json")
    @POST
    @RequiresAuthentication
    @AdaptBy(type = UploadAdaptor.class, args = { "ioc:myUpload" })
    public Object uploadPhoto( @Param("userId") Integer uid,@Param("photo") TempFile tf,HttpServletRequest req, AdaptorErrorContext err) {
        try {
            if (err != null && err.getAdaptorErr() != null) {
                return NutMap.NEW().addv("code", 1).addv("msg", "文件不合法");
            } else if (tf == null) {
                return Result.error("空文件");
            } else {
//                path = Mvcs.getServletContext().getRealPath("/") + "/asserts/user/" + uid + ".jpg"; // 更常规的做法是通过配置文件来确定目标路径.
//                Files.write(path, tf.getInputStream()); // 写入流.
                String p = Globals.AppRoot;
                String f = Globals.AppUploadPath + "/image/" + DateUtil.format(new Date(), "yyyyMMdd") + "/" + R.UU32() + tf.getSubmittedFileName().substring(tf.getSubmittedFileName().indexOf(".jpg"));
                Files.write(new File(p + f), tf.getInputStream());
                return Result.success("上传成功", f);
            }
        } catch (Exception e) {
            return Result.error("系统错误");
        } catch (Throwable e) {
            return Result.error("图片格式错误");
        }
    }

    @Ok("raw:jpg")
    @At("/upload/?/?")
    @Fail("http:404")
    public Object image(String p, String p2) throws IOException {
        if ((p + p2).contains(".."))
            return HttpStatusView.HTTP_404;
        File f = new File("/upload/image", p + "/" + p2 + ".jpg");
        return f;
    }
}

http://localhost:8080/img/upload/20160819/r0k8cilqk0iqsp0l58luqrfha3.jpg
入口方法没有调用到 这个方法没有执行 是为什么呢

别带后缀,否则NutFilter的ignore匹配上了,就忽略了.

http://localhost:8080/img/upload/20160819/r0k8cilqk0iqsp0l58luqrfha3

r u kidding me?

new File(path).delete();

文件被占用, 被打开, 之类的, windows下才会这样.

添加回复
请先登陆
回到顶部