簡體   English   中英

使用Servlet 3.0,我無法獲取上載文件的實際FileName

[英]using servlet 3.0 I cannot get the actual FileName of an uploaded file

我使用Servlet 3.0,PrimeFaces 6.0,WildFly 8.2,Eclipse Neon,Mozilla或Chrome瀏覽器。 盡管遵循以下這些不錯的鏈接:

關於文件上傳的Oracle教程

GitHub:獲取原始文件名示例

我仍然無法確定上傳文件的實際文件名。 我的問題是在下面提到的servlet中的方法調用:

String fileNamer = getFileName(filePart);

給我返回文件名NULL,即fileNamer為null。 我究竟做錯了什么? 請幫忙:

1.)這是我的控制器(Servlet):

@WebServlet("/fileUpload")
@MultipartConfig
public class ImageUploadServlet extends HttpServlet {


private String getFileName(Part part) {
    for (String cd : part.getHeader("content-disposition").split(";")) {
        if (cd.trim().startsWith("filename")) {
            return cd.substring(cd.indexOf('=') + 1).trim()
                    .replace("\"", "");
        }
    }
    return null;
}

@Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException {

        HttpSession session = request.getSession(false);
        Long savedKundeId = (Long) session.getAttribute(NewCustomerBean.SESSION_ATTRIBUTE_CUST_ID);     

        Part filePart = null;
        PrintWriter pw = null;  
        try {
            filePart = request.getPart("uploadImageForNewCustomerformId");
            String fileNamer = getFileName(filePart); 
            // rest of code not shown here

2.)我的觀點(Prime Faces 6.0 facelet):

<h:form id="newCustomerformId">

<!-- rest of code not shown -->
            <p:commandButton type="submit" value="Create Customer"
                            icon="ui-icon-check"
                            actionListener="#{newCustomerBean.saveNewCustomer}"
                            update = "@form"
                            oncomplete="ajaxUploadFile();"/>

</h:form>

<h:form id="uploadImageForNewCustomerformId"
                            enctype="multipart/form-data">
                            <div id="dropzone">
                                <img id="librarypreview" src='' alt='library'
                                    style="width: 280px; height: 160 px;" /> <select name="top5"
                                    id="flist" size="5" onchange="previewFile()">
                                </select>
                                <output id="list"> </output>
                            </div>
                            <input id="fileInput" type="file" name = "file"></input>
                            <span id="uploadStatusId"></span>
                        </h:form>

3.)我的Java Scipt函數,用於Ajax上載文件:

function ajaxUploadFile() {
    var form = document.getElementById('uploadImageForNewCustomerformId');
    if (form == null)
            return;

    var formData = new FormData(form);
    for (var i = 0; i < fileList.length; i ++){
        //append a File to the FormData object
        formData.append("file", fileList[i], fileList[i].name);
    }

    var uploadStatusOutput = document.getElementById("uploadStatusId");
    var request = new XMLHttpRequest();
    request.open("POST", "/javakurs3-biliothek-jsf-mobile/fileUpload");
    request.responseType = 'text';
    request.onload = function(oEvent) {

    if (request.readyState === request.DONE) {
        if (request.status === 200) {

           if (request.responseText == "OK") {
           form.action = "/javakurs3-biliothek-jsf-mobile/pages/customers.jsf";
           form.submit();
           return;
         }
    } 

    uploadStatusOutput.innerHTML = "Error uploading image";



       } // request.readyState === request.DONE

      };  // function (oEvent)

      request.send(formData);


        };

我終於能夠解決問題。 正如BalusC正確地指出的那樣,我不僅使用Java腳本預覽圖像,而且還使用Java腳本上傳圖像。 這引起了混亂,因為PrimeFaces支持使用其自定義的自定義標簽進行圖像預覽和圖像上傳,如下所示。

p:fileUpload展示

使用此p:fileUpload的問題在於它具有自己的按鈕,用於圖像提交或上傳。 但是,我既要提交我新輸入的客戶數據,又要使用“僅一個”按鈕和單擊按鈕來上傳圖像。

我要求的解決方案是在ImageUploadServlet中使用以下代碼

for (Part fPart : request.getParts()){
                if (fPart.getName()!=null && fPart.getName().equals("file") && StringUtils.isNotEmpty(fPart.getSubmittedFileName())){
                    fileNamer =  fPart.getSubmittedFileName();
                    filePart = fPart;
                    break;
                }
            } 

而不是我在問題中提到的代碼:

private String getFileName(Part part) {
    for (String cd : part.getHeader("content-disposition").split(";")) {
        if (cd.trim().startsWith("filename")) {
            return cd.substring(cd.indexOf('=') + 1).trim()
                    .replace("\"", "");
        }
    }
    return null;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM