如何从HttpURLConnection的响应头获取文件名?

时间:2015-04-06 05:28:32

标签: java file-upload httpresponse httpurlconnection response-headers

我有Client Server程序,客户端通过其URL和服务器与服务器建立连接读取文件并写入outputstream,客户端将获取该文件并将其保存在目录中。问题是我没有从服务器获取我发送的文件名。这是我的客户端服务器代码。

客户端,

private void receiveFile() throws IOException {
     String url11="http://localhost:8080/TestServer/TestServer";

        // creates a HTTP connection
        URL url = new URL(UPLOAD_URL);
        HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
        httpConn.setUseCaches(false);
        httpConn.setDoOutput(true);
        httpConn.setRequestMethod("POST");


        int responseCode = httpConn.getResponseCode();

        String ff=httpConn.getHeaderField("filename");
        System.out.println("FHeader :"+ff);

        File saveFile = new File(SAVE_DIR + ff);
        StringBuilder builder = new StringBuilder();
        builder.append(httpConn.getResponseCode())
               .append(" ")
               .append(httpConn.getResponseMessage())
               .append("\n");

        if (responseCode == HttpURLConnection.HTTP_OK) {
            // reads server's response

            System.out.println(builder);
            InputStream inputStream = httpConn.getInputStream();

            // opens an output stream for writing file
            FileOutputStream outputStream = new FileOutputStream(saveFile);

            byte[] buffer = new byte[BUFFER_SIZE];
            int bytesRead = -1;
            System.out.println("Receiving data...");

            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }

            System.out.println("Data received.");
            outputStream.close();
            inputStream.close();

        } else {
            System.out.println("Server returned non-OK code: " + responseCode);
        }


}

服务器,

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    int BUFF_SIZE = 1024;
    byte[] buffer = new byte[BUFF_SIZE];

    String filePath = "E:\\Docs\\Next stop is Kurki.MP3";

    File fileMp3 = new File(filePath);
    if(fileMp3.exists()){
        System.out.println("FOUND : ");
    } else {
        System.out.println("FNF");
    }
    String fNmae=fileMp3.getName();
    FileInputStream fis = new FileInputStream(fileMp3);
    response.setContentType("audio/mpeg");
    response.setHeader("Content-Disposition", "attachment; filename=\"" + fNmae + "\"");
    response.addHeader("fName", fNmae);
    response.setContentLength((int) fileMp3.length());
    OutputStream os = response.getOutputStream();

    try {
        int byteRead = 0;
        while ((byteRead = fis.read(buffer)) != -1) {
           os.write(buffer, 0, byteRead);

        }
        os.flush();
    } catch (Exception excp) {
       // downloadComplete = "-1";
        excp.printStackTrace();
    } finally {
        os.close();
        fis.close();
    }

}

我觉得服务器端的一切都是正确的,任何人都可以帮我解决这个问题。这将是很大的帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

在服务器中尝试:

 File file = new File("E:\\Docs\\Next stop is Kurki.MP3");
            ResponseBuilder response = Response.ok((Object) file);
            response.header("Content-Disposition",
                    "attachment; filename="Next stop is Kurki.MP3");
            return response.build();

当客户端是android:

wv = webView;
        wv.setDownloadListener(new DownloadListener() {
            public void onDownloadStart(String url, String userAgent,
                                        String contentDisposition, String mimetype,
                                        long contentLength) {
                String fileName = URLUtil.guessFileName(url, contentDisposition, mimetype);
                DownloadManager.Request request = new DownloadManager.Request(
                        Uri.parse(url));
                request.allowScanningByMediaScanner();
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                request.setDestinationInExternalPublicDir("/YouPath", fileName);
                DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
                dm.enqueue(request);
            }
        });

请注意客户String fileName = URLUtil.guessFileName(url, contentDisposition, mimetype)