文件上傳(java)

? 最近看了一本書(shū)上的代碼,代碼的主要功能是實(shí)現(xiàn)文件的上傳。但是,當(dāng)我運(yùn)行代碼的時(shí)候竟然報(bào)錯(cuò)了。(我用的IDEA)。有錯(cuò)就解決吧。以下是我遇到的幾個(gè)錯(cuò)誤。

廢話(huà)不多說(shuō)先附上源代碼。

UploadServlet.java

package com;

import java.io.File;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.lang.String;

import java.io.PrintWriter;
import javax.servlet.annotation.MultipartConfig;

import org.apache.catalina.core.ApplicationPart;

@WebServlet("/UploadServlet")
@MultipartConfig(location = "d:/temp")                                  //D盤(pán)手動(dòng)創(chuàng)建temp文件夾
public class UploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String path = this.getServletContext().getRealPath("/");        //獲取服務(wù)器地址
        Part p = request.getPart("file1");                              //獲取用戶(hù)上傳的文件
        if (p.getContentType().contains("image")){                      //僅處理上傳的圖片文件
            ApplicationPart ap =(ApplicationPart)p;  
        String fname1 = ap.getFilename();                               //獲取上傳文件名
            int path_idx = fname1.lastIndexOf("\\") + 1;                //對(duì)上傳文件名進(jìn)行截取
            String fname2 = fname1.substring(path_idx, fname1.length());
            File file = new File(path + "/upload/" + fname2);           //寫(xiě)入web根目錄下的upload文件夾中
            out.write("文件上傳成功");
        }
        else{
            out.write("請(qǐng)選擇圖片文件?。?!");
        }
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

index.jsp

<%--
  Created by IntelliJ IDEA.
  User: Chenaniah Gu
  Date: 2019/5/11
  Time: 21:55
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件上傳</title>
</head>
<body>
<form action="UploadServlet" enctype="multipart/form-data" method="post">
    選擇文件<input type="file" name="file1" id="file1"/>
    <input type="submit" name="upload" value="上傳"/>
</form>
</body>
</html>

這是某本書(shū)的代碼,可能環(huán)境配置和書(shū)上的一樣,不會(huì)出錯(cuò),但是往往都是環(huán)境不一樣。下面來(lái)看幾個(gè)錯(cuò)誤。

1. import org.apache.catalina.core.ApplicationPart;報(bào)錯(cuò)

? 很明顯,這個(gè)報(bào)錯(cuò)就是因?yàn)檎也坏竭@個(gè)包,那么這個(gè)包在哪呢?其實(shí)它就在Tomcat根目錄中的lib文件夾中,這個(gè)包名叫做catalina.jar。導(dǎo)入這個(gè)包文件就OK啦,若導(dǎo)入后不行,那就重啟IDEA。

2. getFilename()方法找不到

? 分析一下,這個(gè)getFilename()方法是哪的?java自帶包定義的?,抱歉沒(méi)搜到。既然不是自帶包,你也沒(méi)定義,那就很有可能是引入包中的方法,再細(xì)細(xì)分析,可以發(fā)現(xiàn)是ap調(diào)用了它,ap的類(lèi)型是什么呢?ApplicationPart。打開(kāi)ApplicationPart方法,如下圖所示。

1.JPG

? 我用的是Tomcat9.0,打開(kāi)ApplicationPart.class

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.apache.catalina.core;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Locale;
import java.util.Map;
import javax.servlet.http.Part;
import org.apache.tomcat.util.http.fileupload.FileItem;
import org.apache.tomcat.util.http.fileupload.ParameterParser;
import org.apache.tomcat.util.http.fileupload.disk.DiskFileItem;
import org.apache.tomcat.util.http.parser.HttpParser;

public class ApplicationPart implements Part {
    private final FileItem fileItem;
    private final File location;

    public ApplicationPart(FileItem fileItem, File location) {
        this.fileItem = fileItem;
        this.location = location;
    }

    public void delete() throws IOException {
        this.fileItem.delete();
    }

    public String getContentType() {
        return this.fileItem.getContentType();
    }

    public String getHeader(String name) {
        return this.fileItem instanceof DiskFileItem ? this.fileItem.getHeaders().getHeader(name) : null;
    }

    public Collection<String> getHeaderNames() {
        if (!(this.fileItem instanceof DiskFileItem)) {
            return Collections.emptyList();
        } else {
            LinkedHashSet<String> headerNames = new LinkedHashSet();
            Iterator iter = this.fileItem.getHeaders().getHeaderNames();

            while(iter.hasNext()) {
                headerNames.add(iter.next());
            }

            return headerNames;
        }
    }

    public Collection<String> getHeaders(String name) {
        if (!(this.fileItem instanceof DiskFileItem)) {
            return Collections.emptyList();
        } else {
            LinkedHashSet<String> headers = new LinkedHashSet();
            Iterator iter = this.fileItem.getHeaders().getHeaders(name);

            while(iter.hasNext()) {
                headers.add(iter.next());
            }

            return headers;
        }
    }

    public InputStream getInputStream() throws IOException {
        return this.fileItem.getInputStream();
    }

    public String getName() {
        return this.fileItem.getFieldName();
    }

    public long getSize() {
        return this.fileItem.getSize();
    }

    public void write(String fileName) throws IOException {
        File file = new File(fileName);
        if (!file.isAbsolute()) {
            file = new File(this.location, fileName);
        }

        try {
            this.fileItem.write(file);
        } catch (Exception var4) {
            throw new IOException(var4);
        }
    }

    public String getString(String encoding) throws UnsupportedEncodingException {
        return this.fileItem.getString(encoding);
    }

    public String getSubmittedFileName() {
        String fileName = null;
        String cd = this.getHeader("Content-Disposition");
        if (cd != null) {
            String cdl = cd.toLowerCase(Locale.ENGLISH);
            if (cdl.startsWith("form-data") || cdl.startsWith("attachment")) {
                ParameterParser paramParser = new ParameterParser();
                paramParser.setLowerCaseNames(true);
                Map<String, String> params = paramParser.parse(cd, ';');
                if (params.containsKey("filename")) {
                    fileName = (String)params.get("filename");
                    if (fileName != null) {
                        if (fileName.indexOf(92) > -1) {
                            fileName = HttpParser.unquote(fileName.trim());
                        } else {
                            fileName = fileName.trim();
                        }
                    } else {
                        fileName = "";
                    }
                }
            }
        }

        return fileName;
    }
}

? 你會(huì)發(fā)現(xiàn)根本沒(méi)有g(shù)etFilename()這個(gè)方法。是不是有一種被騙的感覺(jué)?
怎么解決呢??jī)煞N方法,首先你可以自己寫(xiě)一個(gè)這樣的方法,其次就是用java中的File類(lèi)。

修改后的代碼如下 UploadServlet.java

package com;

import java.io.File;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.lang.String;

import java.io.PrintWriter;
import javax.servlet.annotation.MultipartConfig;

import org.apache.catalina.core.ApplicationPart;

@WebServlet("/UploadServlet")
@MultipartConfig(location = "d:/temp")                                  //D盤(pán)手動(dòng)創(chuàng)建temp文件夾
public class UploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String path = this.getServletContext().getRealPath("/");        //獲取服務(wù)器地址

        System.out.println("服務(wù)器地址是"+path);

        Part p = request.getPart("file1");                              //獲取用戶(hù)上傳的文件
        if (p.getContentType().contains("image")){                      //僅處理上傳的圖片文件
            ApplicationPart ap =(ApplicationPart)p;
            String filename = ap.getSubmittedFileName();                //獲取文件名
            System.out.println(filename);
            File file = new File(path + "/upload/" + filename);
            System.out.println("file.getPath()的值是"+file.getPath());
            p.write(file.getPath());                                    //寫(xiě)入web根目錄下的upload文件夾中
            out.write("文件上傳成功");
        }
        else{
            out.write("請(qǐng)選擇圖片文件?。。?);
        }
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

最后附上一張成功運(yùn)行的截圖

2.JPG
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容