Store file uploads for Contact Form 7
Store file uploads for Contact Form 7
Description
By default, Contact Form 7 dose not keep data it sends trough it’s contact forms.
While plugins like Flamingo save that data, uploaded files are not added to Media Library.
This plugin will save uploaded files to Media Library before email is sent by CF7.
This plugin will raise an event with the the full file path & name.
Subscribe to nmr_create_attachment_file_name filter to get and/or update data before attachment is added to media library.
// The filter callback function.
function example_callback( $file_name ) {
// (maybe) modify $file_name.
return $file_name;
}
add_filter( 'nmr_create_attachment_file_name', 'example_callback', 10, 1 );
Subscribe to nmr_before_insert_attachment filter to be able to change attachment attributes: caption and description are ‘post_excerpt’ and ‘post_content’.
For other attributes, check documentation for wp_insert_attachment.
// The filter callback function.
function before_insert_attachment_callback( $attachment ) {
// (maybe) modify $attachment array.
return $attachment;
}
add_filter( 'nmr_before_insert_attachment', 'before_insert_attachment_callback', 10, 1 );
Optionally, subscribe to nmr_should_skip_save_attachment_to_media_library filter to be able to skip saving the attachment to media library: return true to skip, false is the default behaviour that saves the attachment to media library. Filter nmr_before_insert_attachment will not be called if skip was true.
// The filter callback function.
function skip_media_library_callback( $skip_save_to_media_library ) {
// return true to skip saving to Media Library, false to save.
return true;
}
add_filter( 'nmr_should_skip_save_attachment_to_media_library', 'skip_media_library_callback', 10, 1 );
This plugin will send the final attachment id if you are interested in getting other details, like attachment url.
Listen to nmr_create_attachment_id_generated action.
// The action callback function.
function example_callback_id_generated( $attachment_id ) {
// (maybe) do something with the args.
$url = wp_get_attachment_url( $attachment_id );
}
add_action( 'nmr_create_attachment_id_generated', 'example_callback_id_generated', 10, 1 );
Docs & Support
Check the support forum on WordPress.org. If you can’t locate any topics that pertain to your particular issue, post a new topic for it.
Store file uploads for Contact Form 7 Needs Your Support
It is hard to continue development and support for this free plugin without contributions from users like you. If you enjoy using -Store file uploads for Contact Form 7- and find it useful, please consider making a donation. Your donation will help encourage and support the plugin’s continued development and better user support.
Privacy Notices
With the default configuration, this plugin, in itself, does not:
- track users by stealth;
- write any user personal data to the database;
- send any data to external servers;
- use cookies.
It will, however store uploaded files trough Contact Form 7 in WordPress Media Library.
Make sure your website users are aware of this fact!!!
Pro Version
Need more? The Pro version adds 13 features:
- Per-form control — choose which forms save files, set custom folder and rename pattern per form
- Auto-rename — rename files using patterns like
{name}-{date}.{ext}from other CF7 fields - Unique filenames — automatically avoid overwriting files with the same name
- Custom upload folder — save files to a specific subfolder per form
- File URL in email — replace
[file]mail tag with a clickable link instead of an attachment - Skip-mail compatibility — save files even when CF7’s
skip_mail: onis set - Upload log — admin screen listing every uploaded file with form, date, size, and download link
- Private files — store files outside the Media Library with access protection
- Admin notification — receive an email with file link on every upload
- Flamingo integration — link uploaded files to Flamingo inbound message entries
- Auto-delete — remove uploads older than a configurable number of days
- Image resize / compress — resize and compress images on upload
- Duplicate detection — skip saving if the same file was already uploaded (MD5 check)
Installation
- Upload the entire folder to the
/wp-content/plugins/directory. - Activate the plugin through the ‘Plugins’ menu in WordPress.
After that check Media Library for uploaded files.
Reviews
Great plugin
By solanum on April 21, 2026
I use this plugin on several websites and never had any problems! It works just great.
Thanks!
By benjamintoth on January 25, 2023
Works as expected out of the box.
Great plugin
By jakubborek on October 25, 2022
Getting Error Call to undefined function wp_read_audio_metadata
By mrkhanakia on December 2, 2021
<pre>fatal error:
Array
(
[type] => 1
[message] => Uncaught Error: Call to undefined function wp_read_audio_metadata() in /home/theuxm/html/wp-admin/includes/image.php:489
Stack trace:
#0 /home/theuxm/html/wp-content/plugins/store-file-uploads-for-contact-form-7/store-file-uploads-for-contact-form-7.php(39): wp_generate_attachment_metadata()
#1 /home/theuxm/html/wp-content/plugins/store-file-uploads-for-contact-form-7/store-file-uploads-for-contact-form-7.php(55): nmr_create_attachment()
#2 /home/theuxm/html/wp-includes/class-wp-hook.php(305): nmr_on_before_cf7_send_mail()
#3 /home/theuxm/html/wp-includes/class-wp-hook.php(327): WP_Hook->apply_filters()
#4 /home/theuxm/html/wp-includes/plugin.php(518): WP_Hook->do_action()
#5 /home/theuxm/html/wp-content/plugins/contact-form-7/includes/submission.php(617): do_action_ref_array()
#6 /home/theuxm/html/wp-content/plugins/contact-form-7/includes/submission.php(86): WPCF7_Submission->before_send_mail()
#7 /home/theuxm/html/wp-content/plugins/contact-form-7/includes/submission.php(27): WPCF7_Submission->proceed()
#8
[file] => /home/theuxm/html/wp-admin/includes/image.php
[line] => 489
)
</pre>
Works
By Inna Klementjeva (windseeking) on July 19, 2021
Excellent
By alexwbaumann on March 3, 2021
// Get the path to the upload directory.
$wp_upload_dir = wp_upload_dir();
$upload_path = $wp_upload_dir['path'];
$unique_filename = wp_unique_filename($upload_path, basename($filename));
$attachFileName = $upload_path . '/' . $unique_filename;
copy($filename, $attachFileName);
// Prepare an array of post data for the attachment.
$attachment = array(
'guid' => $attachFileName,
'post_mime_type' => $filetype['type'],
'post_title' => preg_replace('/\.[^.]+$/', '', $unique_filename),
'post_content' => '',
'post_status' => 'inherit'
);
Works smoothly
By agiannastasio on May 14, 2020
Changelog
1.3.0
- Added Pro upsell admin page (Settings > Store CF7 Uploads) showing locked Pro features
1.2.3
Add support for skipping saving to Media Library by using nmr_should_skip_save_attachment_to_media_library filter
1.2.2
Add support for changing attachment attributes using nmr_before_insert_attachment filter
1.2.1
- Added support for media uploads (including mp3)
1.2.0
- Added filter
nmr_create_attachment_file_nameand actionnmr_create_attachment_id_generated
1.1.0
- Contact Form 7
WPCF7_Submission::get_instance()->uploaded_fileschanged in CF7 5.4, so adjustments in this plugin were needed.
1.0.0
- First version.
