Télécharger le fichier avec le nom de fichier d'origine

dans mon projet, je télécharge un fichier. Pendant le téléchargement, j'enregistre son nom de fichier original et son extension dans une base de données et j'enregistre ce fichier avec un GUID sur le serveur, GUID généré est également stocké dans la base de données avec le nom du fichier et l'extension.

Par exemple

- le nom du fichier pour le téléchargement est questions.docx

- alors origalfilename sera "questions"

-extension de fichier sera ".docx"!--3-->

-les Fichiers soient téléchargés avec nom du fichier: "0c1b96d3-af54-40d1-814d-b863b7528b1c"

télécharger fonctionne très bien..mais quand je télécharge un fichier, il est téléchargé avec le nom du fichier comme guide dans le cas ci-dessus son "0c1b96d3-af54-40d1-814d-b863b7528b1c".

Comment puis-je télécharger un fichier avec son nom de fichier original I. e " questions.docx".

Code Ajouté

    /**
     * code to display files on browser
     */
    File file = null;
    FileInputStream fis = null;
    ByteArrayOutputStream bos = null;

    try {
        /**
         * C://DocumentLibrary// path of evidence library
         */
        String fileName = URLEncoder.encode(fileRepo.getRname(), "UTF-8");
        fileName = URLDecoder.decode(fileName, "ISO8859_1");
        response.setContentType("application/x-msdownload");            
        response.setHeader("Content-disposition", "attachment; filename="+ fileName);
        String newfilepath = "C://DocumentLibrary//" + systemFileName;
        file = new File(newfilepath);
        fis = new FileInputStream(file);
        bos = new ByteArrayOutputStream();
        int readNum;
        byte[] buf = new byte[1024];
        try {

            for (; (readNum = fis.read(buf)) != -1;) {
                bos.write(buf, 0, readNum);
            }
        } catch (IOException ex) {

        }
        ServletOutputStream out = response.getOutputStream();
        bos.writeTo(out);
    } catch (Exception e) {
        // TODO: handle exception
    } finally {
        if (file != null) {
            file = null;
        }
        if (fis != null) {
            fis.close();
        }
        if (bos.size() <= 0) {
            bos.flush();
            bos.close();
        }
    }

Est-ce code est parfait?

23
demandé sur Amogh 2013-04-02 14:40:47

6 réponses

vous devez définir votre nom de fichier origin dans l'en-tête de réponse, comme ci-dessous:

String fileName = URLEncoder.encode(tchCeResource.getRname(), "UTF-8");
fileName = URLDecoder.decode(fileName, "ISO8859_1");
response.setContentType("application/x-msdownload");            
response.setHeader("Content-disposition", "attachment; filename="+ fileName);

j'Espère vous aider:)

38
répondu Hunter Zhao 2013-09-26 17:03:44

il suffit de récupérer le nom d'origine dans la base de données et de le définir dans le Content-Disposition header:

@RequestMapping("/../download")
public ... download(..., HttpServletResponse response) {
  ...
  response.setHeader("Content-Disposition", "attachment; filename=\"" + original + "\"");
}
7
répondu Bozho 2013-04-02 10:50:50

Vous pouvez définir le nom de fichier dans l'en-tête.

par exemple, vous utilisez RestFul Webservice puis ResponseBuilder peut être utilisé comme ceci:

ResponseBuilder rsp = Response.ok("Your Content Here", "application/docx");    
rsp.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");

le type de contenu et le nom de fichier sont / peuvent être définis à l'exécution.

0
répondu JSS 2013-04-02 12:33:26

Hi @Amogh utiliser le code ci-dessous

response.setHeader("Content-Disposition", "attachment; filename="+FILENAME+".docx");
0
répondu Srinivas 2013-04-03 09:06:15

le nom D'un fichier avec la Date dans l'en-tête de réponse, vous pouvez utiliser le code suivant:

final String Date_FORMAT = "dd/MM/yyyy"; 
Date currentDate = new Date();
SimpleDateFormat formatDate = new SimpleDateFormat(Date_FORMAT);
String datenew = formatDate.format(currentDate);

response.setContentType("application/pdf");//for pdf file
response.setHeader("Content-disposition","attachment;filename="+ datenew +"Smoelenboek.pdf");

Date_Format peut être n'importe quel format de date que vous voulez!! :)

enter code here
0
répondu Shrutika 2017-05-02 09:09:48

encoder le contenu-la Disposition selon RFC 5987

ce code peut traiter les caractères non ASCII. Une partie du code est copiée de Spring Framework.

import java.nio.charset.Charset;
import org.springframework.http.HttpHeaders;
import org.springframework.util.Assert;

public class HttpHeadersExtended extends HttpHeaders {

    public static final String CONTENT_DISPOSITION_INLINE = "inline";
    public static final String CONTENT_DISPOSITION_ATTACHMENT = "attachment";

    /**
     * Set the (new) value of the {@code Content-Disposition} header
     * for {@code main body}, optionally encoding the filename using the RFC 5987.
     * <p>Only the US-ASCII, UTF-8 and ISO-8859-1 charsets are supported.
     *
     * @param type content disposition type
     * @param filename the filename (may be {@code null})
     * @param charset the charset used for the filename (may be {@code null})
     * @see <a href="https://tools.ietf.org/html/rfc7230#section-3.2.4">RFC 7230 Section 3.2.4</a>
     * @since 4.3.3
     */
    public void setContentDisposition(String type, String filename, Charset charset) {

        if (!CONTENT_DISPOSITION_INLINE.equals(type) && !CONTENT_DISPOSITION_ATTACHMENT.equals(type)) {
            throw new IllegalArgumentException("type must be inline or attachment");
        }

        StringBuilder builder = new StringBuilder(type);
        if (filename != null) {
            builder.append("; ");

            if (charset == null || charset.name().equals("US-ASCII")) {
                builder.append("filename=\"");
                builder.append(filename).append('\"');
            } else {
                builder.append("filename*=");
                builder.append(encodeHeaderFieldParam(filename, charset));
            }
        }
        set(CONTENT_DISPOSITION, builder.toString());
    }

    /**
     * Copied from Spring  {@link org.springframework.http.HttpHeaders}
     *
     * Encode the given header field param as describe in RFC 5987.
     *
     * @param input the header field param
     * @param charset the charset of the header field param string
     * @return the encoded header field param
     * @see <a href="https://tools.ietf.org/html/rfc5987">RFC 5987</a>
     */
    private static String encodeHeaderFieldParam(String input, Charset charset) {
        Assert.notNull(input, "Input String should not be null");
        Assert.notNull(charset, "Charset should not be null");
        if (charset.name().equals("US-ASCII")) {
            return input;
        }
        Assert.isTrue(charset.name().equals("UTF-8") || charset.name().equals("ISO-8859-1"),
            "Charset should be UTF-8 or ISO-8859-1");
        byte[] source = input.getBytes(charset);
        int len = source.length;
        StringBuilder sb = new StringBuilder(len << 1);
        sb.append(charset.name());
        sb.append("''");
        for (byte b : source) {
            if (isRFC5987AttrChar(b)) {
                sb.append((char) b);
            } else {
                sb.append('%');
                char hex1 = Character.toUpperCase(Character.forDigit((b >> 4) & 0xF, 16));
                char hex2 = Character.toUpperCase(Character.forDigit(b & 0xF, 16));
                sb.append(hex1);
                sb.append(hex2);
            }
        }
        return sb.toString();
    }

    /**
     * Copied from Spring  {@link org.springframework.http.HttpHeaders}
     */
    private static boolean isRFC5987AttrChar(byte c) {
        return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') ||
            c == '!' || c == '#' || c == '$' || c == '&' || c == '+' || c == '-' ||
            c == '.' || c == '^' || c == '_' || c == '`' || c == '|' || c == '~';
    }
}
0
répondu cmicat 2017-07-19 11:31:31